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

  • 相关阅读:
    软件的竞争力:性能 CQ
    2010.7.11 OA项目组一周工作报告 CQ
    2010.8.22 OA项目组一周工作报告 CQ
    2010.7.18 OA 项目组一周工作报告 CQ
    我的音乐 CQ
    2010.7.25 OA项目组一周工作报告 CQ
    JavaScript中的关于this
    递归函数的应用
    es6中的对象的可计算的属性名
    undefined 和 undeclared 的区别
  • 原文地址:https://www.cnblogs.com/sjitLearn/p/8445648.html
Copyright © 2020-2023  润新知