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的见解,有什么不对的地方,还请指教,谢谢。

 

posted @ 2018-03-27 15:55  金一,梦开始的地方  阅读(361)  评论(2编辑  收藏  举报