ViewBag,ViewData和TempData
任何机构可以解释,何时使用
- TempData的
- ViewBag
- ViewData的
我有一个要求,我需要在控制器中设置一个值,该控制器将redirect到控制器二和控制器二将呈现视图。
我曾尝试使用ViewBag,当我到达控制器二时,该值会丢失。
我可以知道何时使用和优点或缺点?
谢谢
1)的TempData
允许您存储将重新生存的数据。 在内部它使用会话作为烘烤存储,只是在redirect后,数据被自动驱逐。 模式如下:
public ActionResult Foo() { // store something into the tempdata that will be available during a single redirect TempData["foo"] = "bar"; // you should always redirect if you store something into TempData to // a controller action that will consume this data return RedirectToAction("bar"); } public ActionResult Bar() { var foo = TempData["foo"]; ... }
2)ViewBag,ViewData
允许您将数据存储在将在相应视图中使用的控制器操作中。 这假设该操作返回一个视图,不redirect。 只在当前请求期间生存。
模式如下:
public ActionResult Foo() { ViewBag.Foo = "bar"; return View(); }
并认为:
@ViewBag.Foo
或与ViewData:
public ActionResult Foo() { ViewData["Foo"] = "bar"; return View(); }
并认为:
@ViewData["Foo"]
ViewBag
只是ViewData
一个dynamic包装,只存在于ASP.NET MVC 3中。
这就是说,这两个构念都不应该被使用。 您应该使用视图模型和强types视图。 所以正确的模式如下:
查看模型:
public class MyViewModel { public string Foo { get; set; } }
行动:
public Action Foo() { var model = new MyViewModel { Foo = "bar" }; return View(model); }
强烈的观点:
@model MyViewModel @Model.Foo
在这个简短的介绍之后,我们回答你的问题:
我的要求是我想在控制器中设置一个值,该控制器将redirect到ControllerTwo,Controller2将呈现视图。
public class OneController: Controller { public ActionResult Index() { TempData["foo"] = "bar"; return RedirectToAction("index", "two"); } } public class TwoController: Controller { public ActionResult Index() { var model = new MyViewModel { Foo = TempData["foo"] as string }; return View(model); } }
和相应的视图( ~/Views/Two/Index.cshtml
):
@model MyViewModel @Html.DisplayFor(x => x.Foo)
使用TempData也有一些缺点:如果用户在目标页面上点击F5,数据将会丢失。
我个人也不使用TempData。 这是因为它在内部使用Session,我在应用程序中禁用会话。 我更喜欢更加RESTful的方式来实现这一点。 也就是说:在第一个控制器操作中,执行redirect在数据存储中存储对象,并在redirect时为用户生成唯一的标识。 然后在目标动作上使用这个ID取回最初存储的对象:
public class OneController: Controller { public ActionResult Index() { var id = Repository.SaveData("foo"); return RedirectToAction("index", "two", new { id = id }); } } public class TwoController: Controller { public ActionResult Index(string id) { var model = new MyViewModel { Foo = Repository.GetData(id) }; return View(model); } }
视图保持不变。
ASP.NET MVC为我们提供了三个选项ViewData,ViewBag和TempData,用于将数据从控制器传递到查看和下一个请求。 ViewData和ViewBag几乎是相似的,TempData执行额外的责任。 让我们讨论或得到这三个对象的关键点:
ViewBag&ViewData之间的相似之处:
- 帮助您从控制器移动到查看时保持数据。
- 用于将数据从控制器传递到相应的视图。
- 寿命短意味着redirect时值变为空。 这是因为他们的目标是提供一种在控制器和视图之间进行通信的方式。 这是服务器调用中的通信机制。
ViewBag&ViewData之间的区别:
- ViewData是从ViewDataDictionary类派生并可以使用string作为键访问的对象的字典。
- ViewBag是一个dynamic属性,它利用了C#4.0中的新dynamic特性。
- ViewData需要对复杂数据types进行types转换,并检查空值以避免错误。
- ViewBag不需要对复杂的数据types进行types转换。
ViewBag&ViewData示例:
public ActionResult Index() { ViewBag.Name = "Monjurul Habib"; return View(); } public ActionResult Index() { ViewData["Name"] = "Monjurul Habib"; return View(); }
在视图中:
@ViewBag.Name @ViewData["Name"]
TempData的:
TempData也是一个从TempDataDictionary类派生的字典,存储在short lives session中,它是一个string键和对象值。 不同之处在于对象的生命周期。 TempData保存HTTP请求的时间信息。 这只意味着从一个页面到另一个页面。 这也适用于302/303redirect,因为它在同一个HTTP请求中。 有助于在从一个控制器移到另一个控制器或从一个操作移动到另一个操作时保持数据。 换句话说,当您redirect时,“TempData”有助于维护这些redirect之间的数据。 它在内部使用会话variables。 当前和后续请求期间临时数据的使用仅意味着在您确定下一个请求将redirect到下一个视图时使用。 它需要对复杂数据types进行types转换,并检查空值以避免错误。 通常用于存储一次性消息,如错误消息,validation消息。
public ActionResult Index() { var model = new Review() { Body = "Start", Rating=5 }; TempData["ModelName"] = model; return RedirectToAction("About"); } public ActionResult About() { var model= TempData["ModelName"]; return View(model); }
最后一个机制就是像ViewData一样工作的Session,就像一个字典,它为键值和对象值。 这个存储在客户端Cookie中,可以使用更长的时间。 它也需要更多的validation,从来没有任何机密的信息。 对于ViewData或ViewBag,您应该智能地使用它来获得应用程序的性能。 因为每个动作都经历了正规的asp.net mvc请求的整个生命周期。 您可以在您的子操作中使用ViewData / ViewBag,但要小心不要使用它来填充可能污染控制器的无关数据。
TempData的
基本上就像一个DataReader,一旦读取,数据将会丢失。
检查这个video
例
public class HomeController : Controller { public ActionResult Index() { ViewBag.Message = "Welcome to ASP.NET MVC!"; TempData["T"] = "T"; return RedirectToAction("About"); } public ActionResult About() { return RedirectToAction("Test1"); } public ActionResult Test1() { String str = TempData["T"]; //Output - T return View(); } }
如果您注意上面的代码,那么在读取TempData之前,RedirectToAction对TempData没有影响。 所以,一旦TempData被读取,值就会丢失。
如何在阅读后保持TempData?
检查Action Method Test 1和Test 2中的输出
public class HomeController : Controller { public ActionResult Index() { ViewBag.Message = "Welcome to ASP.NET MVC!"; TempData["T"] = "T"; return RedirectToAction("About"); } public ActionResult About() { return RedirectToAction("Test1"); } public ActionResult Test1() { string Str = Convert.ToString(TempData["T"]); TempData.Keep(); // Keep TempData return RedirectToAction("Test2"); } public ActionResult Test2() { string Str = Convert.ToString(TempData["T"]); //OutPut - T return View(); } }
如果注意上面的代码,在RedirectToAction之后以及读取数据之后数据不会丢失,原因是我们正在使用TempData.Keep()
。 就是它
通过这种方式,只要您希望在其他控制器中也可以使其保持。
ViewBag /的ViewData
数据将持续到相应的视图
MVC中的ViewBag,ViewData,TempData和View State
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
ASP.NET MVC为我们提供了三个选项ViewData,VieBag和TempData,用于将数据从控制器传递到查看和下一个请求。 ViewData和ViewBag几乎是相似的,TempData执行额外的责任。
ViewBag&ViewData之间的相似之处:
帮助您从控制器移动到查看时保持数据。 用于将数据从控制器传递到相应的视图。 寿命短意味着redirect时值变为空。 这是因为他们的目标是提供一种在控制器和视图之间进行通信的方式。 这是服务器调用中的通信机制。
ViewBag&ViewData之间的区别:
ViewData是从ViewDataDictionary类派生并可以使用string作为键访问的对象的字典。 ViewBag是一个dynamic属性,它利用了C#4.0中的新dynamic特性。 ViewData需要对复杂数据types进行types转换,并检查空值以避免错误。 ViewBag不需要对复杂的数据types进行types转换。
ViewBag&ViewData示例:
public ActionResult Index() { ViewBag.Name = "Arun Prakash"; return View(); } public ActionResult Index() { ViewData["Name"] = "Arun Prakash"; return View(); }
在视图中,我们调用如下:
@ViewBag.Name @ViewData["Name"]
TempData的:
有助于在从一个控制器移到另一个控制器或从一个操作移动到另一个操作时保持数据。 换句话说,当您redirect时,“Tempdata”有助于维护这些redirect之间的数据。 它在内部使用会话variables。 TempData是一个非常短暂的实例,你只能在当前和后续的请求中使用它
使用TempData可靠工作的唯一场景是在redirect时。 这是因为redirect杀死了当前的请求(并发送HTTP状态码302对象移动到客户端),然后在服务器上创build一个新的请求来服务redirect的视图。
它需要对复杂的数据types进行types转换,并检查空值以避免错误。
public ActionResult Index() { var model = new Review() { Body = "Start", Rating=5 }; TempData["ModelName"] = model; return RedirectToAction("About"); } public ActionResult About() { var model= TempData["ModelName"]; return View(model); }
Asp.Net MVC中的TempData是非常有用的function之一。 它用于将数据从当前请求传递到后续请求。 换句话说,如果我们想在发生redirect的时候从一个页面发送数据到另一个页面,我们可以使用TempData,但是我们需要在代码中做一些考虑,以在MVC中实现这个function。 由于TempData的使用寿命非常短,只有在目标视图完全加载之前。 但是,我们可以使用Keep()方法将数据保存在TempData中。
阅读更多
void Keep() Calling this method with in the current action ensures that all the items in TempData are not removed at the end of the current request. @model MyProject.Models.EmpModel; @{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Title = "About"; var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting TempData.Keep(); // retains all strings values } void Keep(string key) Calling this method with in the current action ensures that specific item in TempData is not removed at the end of the current request. @model MyProject.Models.EmpModel; @{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Title = "About"; var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting TempData.Keep("emp"); // retains only "emp" string values }
TempData将一直可用,直到第一次阅读,一旦你阅读它不可用任何更多可以是有用的传递快速消息也查看,将在第一次阅读后消失。 ViewBag在将快速数据传递给视图时更加有用,通常你应该通过模型将所有的数据传递给视图,但是在这种情况下,当你将模型直接从类映射到数据库的数据库的时候,如何改变你的模型来传递一个新的数据,你可以将其粘贴到viewbag ViewData只是ViewBag的索引版本,并在MVC3之前使用
viewbag和temptdata的范围也不同。 viewbag基于第一个视图(不是在动作方法之间共享),但是temptdata可以在一个动作方法和另一个之间共享。