任何机构都可以解释,何时使用
TempData的
ViewBag
ViewData的
我有一个要求,我需要在控制器中设置一个值,控制器将重定向到控制器二,控制器二将呈现视图.
我试图使用ViewBag,当我到达Controller Two时,值会丢失.
我可以知道何时使用和优缺点?
谢谢
1)的TempData
允许您存储为重定向而存活的数据.在内部,它使用Session作为后备存储,在重定向之后,数据被自动驱逐.模式如下:
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
允许您将数据存储在将在相应视图中使用的控制器操作中.这假定操作返回视图但不重定向.仅在当前请求期间生活.
模式如下:
public ActionResult Foo() { ViewBag.Foo = "bar"; return View(); }
并在视图中:
@ViewBag.Foo
或者使用ViewData:
public ActionResult Foo() { ViewData["Foo"] = "bar"; return View(); }
并在视图中:
@ViewData["Foo"]
ViewBag
它只是一个动态包装器ViewData
,仅存在于ASP.NET MVC 3中.
话虽这么说,但这两种结构都不应该被使用.您应该使用视图模型和强类型视图.所以正确的模式如下:
查看型号:
public class MyViewModel { public string Foo { get; set; } }
行动:
public Action Foo() { var model = new MyViewModel { Foo = "bar" }; return View(model); }
强类型视图:
@model MyViewModel @Model.Foo
在简要介绍之后,让我们回答你的问题:
我的要求是我想在控制器1中设置一个值,该控制器将重定向到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的方式来实现这一目标.这是:在第一个执行重定向的控制器操作中,将对象存储在数据存储中,并在重定向时使用生成的唯一ID.然后在目标操作上使用此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之间的相似之处:
从控制器移动到视图时,有助于维护数据.
用于将数据从控制器传递到相应的视图.
短寿命意味着当重定向发生时,值变为空.这是因为他们的目标是提供一种在控制器和视图之间进行通信的方法.它是服务器调用中的通信机制.
ViewBag和ViewData之间的区别:
ViewData是一个对象字典,它是从ViewDataDictionary类派生的,可以使用字符串作为键访问.
ViewBag是一个动态属性,它利用了C#4.0中的新动态功能.
ViewData需要对复杂数据类型进行类型转换,并检查空值以避免错误.
ViewBag不需要对复杂数据类型进行类型转换.
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类派生的字典,存储在短生命会话中,它是一个字符串键和对象值.不同之处在于物体的生命周期.TempData保存HTTP请求时间的信息.这仅意味着从一个页面到另一个页面.这也适用于302/303重定向,因为它位于相同的HTTP请求中.当您从一个控制器移动到另一个控制器或从一个操作移动到其他操作时,有助于维护数据.换句话说,当您重定向时,"TempData"有助于维护这些重定向之间的数据.它在内部使用会话变量.在当前和后续请求期间使用临时数据仅意味着在您确定下一个请求将重定向到下一个视图时使用它.它需要对复杂数据类型进行类型转换,并检查空值以避免错误.
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); }
最后一种机制是Session,它像ViewData一样工作,就像一个字典,它接受键的字符串和值的对象.这个存储在客户端Cookie中,可以使用更长时间.它还需要更多验证才能永远不会有任何机密信息.关于ViewData或ViewBag,您应该智能地使用它来提高应用程序性能.因为每个动作都经历了常规asp.net mvc请求的整个生命周期.您可以在子操作中使用ViewData/ViewBag,但请注意不要使用它来填充可能污染控制器的无关数据.
基本上它就像一个DataReader,一旦读取,数据就会丢失.
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(); } }
如果您注意上面的代码,RedirectToAction对TempData没有任何影响,直到读取TempData.因此,一旦读取了TempData,值就会丢失.
检查操作方法测试1和测试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()
.就是它
数据将持久保存到相应的视图