MVC基础篇—控制器与视图数据的传递
Viewdata,Viewbag,Tempdata
1 Vewdata:简单来说就是数据字典,通过键值对的形式来存放数据。举例如下:
//后台控制器代码:
public ActionResult ViewdataPractise() { ViewData["name"] = "Hello,Viewdata"; return View(); }
前台页面代码:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>ViewdataPractise</title> </head> <body> <div> @ViewData["name"] </div> </body> </html>
结果:Hello,Viewdata
2 Viewbag:简单来说,是动态视图数据字典,是dynamic类型的对象,也可以用来将后台控制器的数据传递到前台View中去。
//后台控制器代码:
public class HomeController : Controller { public ActionResult Index() { ViewBag.Name = "Hello,Viewbag"; return View(); } }
前台页面代码:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>ViewbagPractice</title> </head> <body> <div> @ViewBag.Name </div> </body> </html>
结果:Hello,Viewbag
看到这里读者应该会有疑惑,不是一样吗?,两者的区别是什么?接下来,简单介绍下两者的联系与区别:
分别给viewdata和viewbag赋值一个字符串数组如下:
Viewdata:
public ActionResult Index() { string[] data = new string[] {"阳光普照","万物生长" }; ViewData["key"] = data; return View(); }
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>ViewbagPractice</title> </head> <body> <div> <table> @foreach (var data in (string[])ViewData["key"]) { <tr><td>@data</td></tr> } </table> </div> </body> </html>
结果:阳光普惠
万物生长
可以发现在View中,遍历Viewdata中的时候,需要对数组类型强转为字符串类型,不转的话会报错。然而如果是遍历Viewbag的话,就不需要强转,因为viewbag是dynamic类型,会自动转换的。
结论:Viewdata是数据字典的键值对结合,在View中可能需要强转,Viewbag是dynamic类型的对象,在view中不需要强转,因为其内部会自动转换。通过反编译器发现,Viewbag本质就是Viewdata,只是多了层dynamic控制。所以使用哪个看个人爱好,这是我自己的见解。
3 Tempdata(扩展):存放临时数据,用于在不同Action之间传递数据,但是在获取过一次数据后,刷新页面,该数据为null。
public ActionResult Index() { TempData["key"] = "临时数据"; ViewData["key1"] = "Viewdata数据"; return View(); } public ActionResult GetTempData() { return View(); }
GetTempdata页面:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>GetTempData</title> </head> <body> <div> @TempData["key"] </div><br /> <span>@ViewData["key1"]</span> </body> </html>
结果:临时数据。如果将GetTempdata页面刷新,临时数据消失,结果为空
结论:viewdata和viewbag数据只能在本视图页面上传递数据,但是tempdata可以在不同的视图传递数据,但是当获取过一次tempdata数据后,该数据会消失,然而viewdata和viewbag中的数据不会消失。还有就是tempdata数据是存储在session中的。如果禁用sessionstate,那么就会报异常。
以上就是自己对Viewdata,Viewbag,Tempdata的见解,有什么不对的地方,还请指教,谢谢。
- MVC基础篇—控制器与视图数据的传递
- ASP.NET中MVC从后台控制器传递数据到前台视图的方式
- ASP.NET MVC 5 - 将数据从控制器传递给视图
- ASP.NET MVC 5 - 将数据从控制器传递给视图
- MVC使用jQuery从视图向控制器传递Model,数据验证,MVC HTML辅助方法小结
- ASP.NET MVC之控制器传递数据到视图的四种方式
- MVC使用jQuery从视图向控制器传递Model,数据验证,MVC HTML辅助方法小结
- ASP.NET MVC 5 - 将数据从控制器传递给视图
- ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
- ASP.NET MVC之从控制器传递数据到视图四种方式(一)
- ASP.NET MVC从控制器传递数据到视图的四种方式详解
- ASP.NET MVC 5 学习教程:控制器传递数据给视图
- MVC控制器和视图间的数据传递
- ASP.NET MVC 5 - (4) 将数据从控制器传递给视图
- ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
- ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
- MVC使用jQuery从视图向控制器传递Model,数据验证,MVC HTML辅助方法小结
- ASP.NET MVC中从后台控制器(Controller)传递数据到前台页面视图(View)方式
- MVC 5 - 将数据从控制器传递给视图
- ASP.NET中MVC从后台控制器传递数据到前台视图的方式