• MVC中的ViewData、ViewBag和TempData


    一、ViewBag和ViewData的定义

    public dynamic ViewBag { get; }
    public ViewDataDictionary ViewData { get; set; }
    


    二、ViewBag和ViewData的差别

    viewdata viewbag
    它是key/value字典集合 它是dynamic类型对象
    从asp.net mvc1就有了 从asp.netmvc3才有
    基于asp.netframework 3.5 基于asp.net framework4.0
    viewdata比viewbag快 viewbag比viewdata慢
    页面查询数据时须要转换合适的类型 在页面查询数据时不须要转换合适的类型
    有一些类型转换代码 可读性较好

    ViewBag不再是字典的键值对结构,而是dynamic动态类型,它会在程序执行的时候动态解析。


    ViewBag.NumberObjs = new string[] { "one", "two", "three" };
                ViewData["NumberArrs"] = new string[] { "one", "two", "three" };
    
                //正确,dynamic类型的解析作用,foreach能够使用
                foreach (var item in ViewBag.NumberObjs)
                {
    
                }
    
                //错误:foreach语句不可作用于object类型对象上
                foreach (var item in ViewData["NumberArrs"])
                {
    
                }


    1、ViewBag事实上本质就是ViewData。仅仅是多了层Dynamic控制。所以。使用何种方式全然取决于你的个人爱好。

    2、ViewBag和ViewData仅针对当前Action中有效。生命周期和view同样


    三、TempData

          保存在session中,Controller每次运行请求时。会从session中获取tempdata,而后清空session,获取完tempdata数据。尽管保存在内部字典中。可是字典中每一个条目訪问一次后就从字典中删除。因此Tempdata数据最多仅仅能经过一次controller传递。而且每一个元素最多仅仅能訪问一次。之后删除


    四、举例


    在Controller中使用ViewData:
    <pre name="code" class="csharp">public ActionResult UsingViewData()
            {
                ViewData["Title"] = "Using ViewData";
                ViewData["ProjectName"] = "My Test Project";
                ViewData["ProjectDescription"] = "This is TestProject to demo Viewdata and viewbag details";
                ViewData["StartDate"] = new DateTime(2011, 1, 1);
                ViewData["TotalPrice"] = 1000;
                ViewData["TotalDays"] = 100;
                Dictionary<string, string> stackholder = new Dictionary<string, string>();
                stackholder.Add("Client", "Mr.Client");
                stackholder.Add("Manager","Mr.Joy");
                stackholder.Add("Team Leader","Mr.Toy");
                stackholder.Add("Sr.developer","Mr.dojoy");
                stackholder.Add("developer","Mr.nodoy");
                ViewData["stackholder"]=stackholder;
    
                List<string>modules =new List<string>();
                modules.Add("Admin module");
                modules.Add("ShoppingCart module");
                modules.Add("CMS module");
                ViewData["modules"]=modules;
                return View();
            }

    
    
    <div><span style="color: rgb(35, 35, 35); font-family: Verdana, Arial, helvetica, sans-seriff; font-size: 14px; line-height: 25px; orphans: 2; text-align: -webkit-auto; widows: 2;">相应UsingViewData View的cshtml:</span></div><pre name="code" class="html">@{
        ViewBag.Title = "UsingViewData";
    }
    
    <h1>@ViewData["Title"]</h1>
     <div>
       <div>
        <h2>Project Name : @ViewData["ProjectName"]</h2>
       </div>
       <div>
         ProjectDescription :   
         <p>"@ViewData["ProjectDescription"]".</p>
       </div>
       <div>
          Stack Holder :
          <br />
    
          <ul id="stakholder">
          @foreach ( var stakerholder in ViewData["stackholder"] as Dictionary<string, string> )
          {          
        <li>
            @stakerholder.Key   : @stakerholder.Value
        </li>
          }
         </ul>
       </div>
       <div>
         Project Details:<br />
         <div>
           module List  :
           <ul id="modulelist">
          @foreach ( var module in ViewData["modules"] as List<string> )
          {          
        <li>
            @module
        </li>
          }
         </ul>
            
         </div>
         Project StartDate : @ViewData["StartDate"]  <br />
         Project TotalPrice: @ViewData["TotalPrice"] <br />
         Project TotaDays  : @ViewData["TotalDays"] 
       </div>
     </div>
    
    
    

    ViewBag controller:

            public ActionResult UsingViewBag()
            {
                ViewBag.Title = "Using ViewBag";
                ViewBag.ProjectName = "My Test Project";
                ViewBag.ProjectDescription = "This is Test Project to demo Viewdata and viewbag details";
                ViewBag.StartDate = new DateTime(2011, 1, 1);
                ViewBag.TotalPrice = 1000;
                ViewBag.TotalDays = 100;
                Dictionary<string, string> stackholder = new Dictionary<string, string>();
                stackholder.Add("Client", "Mr.Client");
                stackholder.Add("Manager", "Mr.Joy");
                stackholder.Add("Team Leader", "Mr.Toy");
                stackholder.Add("Sr.developer", "Mr.doyjoy");
                stackholder.Add("developer", "Mr.nodoy");
                ViewBag.stackholder = stackholder;
    
                List<string> modules = new List<string>();
                modules.Add("Admin module");
                modules.Add("ShoppingCart module");
                modules.Add("CMS module");
                ViewBag.modules = modules;
                return View();
            }

    相应的页面:

    @{
        ViewBag.Title = "UsingViewBag";
    }
    
    <h1>@ViewBag.Title</h1>
     <div>
       <div>
        <h2>Project Name : @ViewBag.ProjectName</h2>
       </div>
       <div>
         ProjectDescription :   
         <p>"@ViewBag.ProjectDescription.</p>
       </div>
       <div>
          Stack Holder :
          <br />
    
          <ul id="stakholder">
          @foreach ( var stakerholder in ViewBag.stackholder )
          {          
        <li>
            @stakerholder.Key   : @stakerholder.Value
        </li>
          }
         </ul>
       </div>
       <div>
         Project Details:<br />
         <div>
           module List  :
           <ul id="modulelist">
          @foreach ( var module in ViewBag.modules )
          {          
        <li>
            @module
        </li>
          }
         </ul>
            
         </div>
         Project StartDate : @ViewBag.StartDate.ToString("dd-MMM-yyyy") <br />
         Project TotalPrice: @ViewBag.TotalPrice  ₹  <br />
         Project TotaDays  : @ViewBag.TotalDays 
       </div>
     </div>
    

    五、总结


    1、ViewDataTempData是字典类型。赋值方式用字典方式,ViewData["myName"] 

    2、ViewBag是动态类型。使用时直接加入属性赋值就可以 ViewBag.myName

    3、ViewBagViewData仅仅在当前Action中有效,等同于View

    4、TempData能够通过转向继续使用。由于它的值保存在Session中。但TempData仅仅能经过一次传递,之后会被系统自己主动清除

    5、ViewDataViewBag中的值能够互相訪问。由于ViewBag的实现中包括了ViewData


  • 相关阅读:
    利用JQuery+EasyDrag jQuery Plugin实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值 Virus
    批量(导入导出)迁移AD中的用户信息和密码到新环境中,同时保持用户在MOSS中的权限【addusers,ldifde,copypwd,UserInfo,tp_SystemID】 Virus
    修改MOSS网站的URL访问地址 Virus
    MOSS安装目录Layouts中的文件不能用SharePoint Designer修改 Virus
    Office Server 共享服务报错,原因:对路径“c\windows\system32\drivers\ect\hosts”的访问被拒绝 Virus
    微软文档翻译:【最佳实践】使用sharepoint对象模型编程时候的常见问题 Virus
    WCF自定义行为 Step by Step (一)搭建环境
    土了,Silverlight调试一例
    WCF之自定义Channel
    WCF自定义行为 Step by Step (四)第二个自定义behavior
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6805332.html
Copyright © 2020-2023  润新知