ASP.NET MVC程序传值方式:ViewData,ViewB

2021-05-19  本文已影响0人  飞天猪Pony

在ASP.NET MVC中,页面间Controller与View之间主要有以下几种小量数据的传值方式:ViewData、ViewBag、TempData和Session变量。

下面就这四种传值方式做出详细介绍。

一、ViewData

下面我们来看一个简单的例子,演示一下如何使用ViewData来从Controller向View传值。

 public ActionView Index()
 {
     ViewData["Message"] = "This is a message from ViewData.";
     return View();  
 }

然后我们在视图中使用这个变量:

<div>
    @ViewData["message"].ToString() 
</div>

综上,ViewData更适合从Controller向View传递简单对象数据时使用。

二、ViewBag

同样,我们来通过一个简单的例子来演示一下如何利用ViewBag从Controller向View传递数据。

public ActionView Index()
{
    ViewBag.Message = "This is a message from ViewBag.";
    return View();
}

然后我们在视图中取出数据并显示:

<div>
    @ViewBag.Message
</div>

综上,ViewBag更适合从Conroller向View传递复杂数据时使用,因为取出存储在其中的数据变量时无需进行类型转换。

三、ViewData和ViewBag的区别和联系

1.ViewData和ViewBag其实是一回事,ViewBag其实是对ViewData的封装,其内部其实是使用ViewData实现内部存储的。

2.唯一的不同点是,ViewBag可以存储动态类型的变量值(dynamic),它会在程序运行的时候动态解析,而ViewData只能存储String Key/Object Value字典数组。

ViewData中的变量为Object类型,而ViewBag中的变量是dynamic类型,他们的区别是,dynamic类型在使用时会自动根据数据类型转换,而ViewData中的变量值则需要我们进行强制转换。

3.通过转到定义我们可以看到:

[Dynamic]
public dynamic ViewBag { get; }
public ViewDataDictionary ViewData { get; set; }

这里ViewBag只有get方法,没有set方法。

4.ViewData比ViewBag读取速度快。

四、TempData

下面,我们来透过一个例子来演示一下如何在两个Action方法中传递数据。

首先创建一个Model类,如下

public class Customer
{
    public int Id { get; set; }
    public string Code {  get; set; }
    public double Amount {  get; set; }
}

然后在Controller中加入如下代码:

public ActionView DisplayCustomer1
{
    Customer customer = new Customer
    {
        Id = 1001,
        Code = "100101",
        Amount = 100
     };

    TempData["Customer"] = customer;

    return RedictToAction("DisplayCustomer2");
}

public ActionView DisplayCustomer2
{
    Customer customer = TempData["OneCustomer"] as Customer;

    return View(customer );
}

最后创建一个强类型的视图来显示客户信息,此处代码略。

综上,TempData主要是用在需要在多个Acions或者页面重定向时共享传递数据时使用。

五、Session

我们仍然使用上面的例子,假如我们不用TempData,而用Session也可以得到同样的结果。

public AcionView DisplayCustomer1
{
    Customer customer = new Customer
    {
         Id = 1001,
         Code = "10011",
         Amount = 100
    };

    Session["OneCustomer"] = customer;

    return RedictToAction("DisplayCustomer2");
}

public ActionResult DisplayCustomer2
{
    Customer customer = Session["OneCustomer"] as Customer;

    return View(customer);
}

Session的生命周期最长,但是它默认的是使用Cookies来存储数据,所以使用的时候必须注意数据保密的问题。

综上,Session主要在需要多个Controllers, Actions and Views共享数据(非敏感数据)时使用。

六、传递数据的生命周期

生命周期
Maintains data between ViewData/ViewBag TempData Session
Controller to Controller No Yes Yes
Controller to View Yes Yes Yes
View to Contorller No No Yes
上一篇 下一篇

猜你喜欢

热点阅读