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