2012-10-01 172 views

回答

71
  • ViewData/ViewBag - 仅在当前请求期间有效。
    您将其设置为控制器操作并在视图中使用它,然后消失。
    区别在于第一个字典是字典,第二个字典只是一个dynamic封装。
    两者都指向相同的数据。
    ViewBag在ASP.NET MVC 3推出

例子:

public ActionResult Index() 
{ 
    ViewData["foo"] = "bar"; 
    return View(); 
} 

和视图中,你可以使用这个值:

<div>@ViewData["foo"]</div> 

同样的,ViewBag但它是动态:

public ActionResult Index() 
{ 
    ViewBag.foo = "bar"; 
    return View(); 
} 

and inside该视图中,您可以使用此值:

<div>@ViewBag.foo</div> 

因此,大家可以看到的ViewData/ViewBag只是​​将信息传递给从比较经典的一个控制器动作视图的另一种方式,并建议其使用视图方式型号:

public class MyViewModel 
{ 
    public string Foo { get; set; } 
} 

然后:

public ActionResult Index() 
{ 
    var model = new MyViewModel { Foo = "bar" }; 
    return View(model); 
} 

和你的强类型的视图中:

@model MyViewModel 
<div>@Html.DisplayFor(x => x.Foo)</div> 

正如您所看到的,使用视图模型提供了将信息从控制器操作传递到视图的强类型方法。

  • TempData的 - 它允许用于单个后续请求的持续时间持续信息。你在TempData里存储一些东西,然后重定向。在重定向到的目标控制器操作中,您可以检索存储在TempData中的值。

例子:

public ActionResult Foo() 
{ 
    TempData["foo"] = "bar"; 
    return RedirectToAction("bar"); 
} 

public ActionResult Bar() 
{ 
    var value = TempData["foo"] as string; 
    // use the value here. If you need to pass it to the view you could 
    // use ViewData/ViewBag (I can't believe I said that but I will leave it for the moment) 
    return View(); 
} 

ASP.NET MVC将自动过期,已存储在TempData一旦你读它的价值。在封面之下,ASP.NET MVC将信息保存到Session中。

  • 会议 - 同TempData的不同之处在于它永远不会到期 - 这将是适用于所有的请求,而不是一个单一的重定向。
+15

你可以叫'保持()'取消标记TempData的价值为过期 'TempData.Keep( “富”);'让 “foo” 的值 'TempData.Keep();'保留的所有值TempData – nomail

+0

我很难看到tempdata的用例。难道你没有通过使用foo值成为一个需求,因此它不应该只是一个参数吗?不知道。我觉得它闻起来。更多,如果你开始.Keep() - 你的tempdata中的东西... –

+0

会话永不过期? MVC中的会话变量是否与Web表单中的工作不同?还是默认设置为永不过期? – pqsk

4

ASP。net MVC引入了ViewData,ViewBag,TempData,Session来传递控制器之间的数据来查看。

的ViewData

ViewData的是通过使用存储在CurrentRequestContext的ViewDataDictionary类中实现。因此,ViewData生命周期将在当前请求结束时结束。

ViewBag也像ViewData,唯一不同的是它可以使用动态对象动态共享数据。

TempData的是一个非常短暂的情况下,你应该只在当前随后请求,如果你想使用重定向(RedirectToAction,RedirectToRoute,重定向将内整合得心应手过程中使用它)在ASP.net MVC并在重定向之间传递一些数据。 TempData将数据存储在Session中,但框架在当前和后续请求结束时处理数据。

会议是长寿命(永不过期)属于用户session.You需要当您使用会话变量可以很容易地导致问题要留神数据。

protected void Session_Start(Object sender, EventArgs e) 
{ 
    int userType = 1; 
    HttpContext.Current.Session.Add("_SessionUserType",userType); 
} 
4

的ViewData:

  • 是从ViewDataDictionary继承了一个特殊的字典。
  • 用于从控制器发送数据以查看。
  • 它的寿命是目前的要求。
  • 如果您有Redirect,它将被销毁。
  • 出于安全原因,最好在使用前检查它是否为null
  • 铸造应该为操作完成。

ViewBag:

  • 是动态类型(这种类型的呈现在C#4)。

  • ViewData一样用于将数据从控制器发送到视图。

  • 它在当前请求中的值的有效期限。
  • 在页面间重定向时,其值将为空。
  • 出于安全原因使用前,请检查它是否为null
  • 铸件没有必要,所以它比ViewData更快。

的TempData:

  • 一种特别的字典从TempDataDictionary的。
  • 它有短生命期,并用于发送页面之间的信息(Redirect)。
  • 完全呈现View后,其值将为null
  • 出于安全原因使用前,请检查它是否为null
  • 铸造应该为操作完成。

会议:

  • 用于发送不同请求之间的信息。
  • 它的值不是null非空值;除非在一定时间后(session expire)。
  • 出于安全原因使用前,请检查它是否为null
  • 铸造应该为操作完成。

This文章解释了ViewData,ViewBag和TempData之间的区别。我希望你可以根据你的需要参考这篇文章。

相关问题