zoukankan      html  css  js  c++  java
  • ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 动态数据的呈现

    https://www.cnblogs.com/cynchanpin/p/7065098.html

    在MVC3開始。视图数据能够通过ViewBag属性訪问。在MVC2中则是使用ViewData。MVC3中保留了ViewData的使用。ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary)。

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

    所以在视图中获取它的数据时候不须要进行类型转换

    ViewData ViewBag
    它是Key/Value字典集合 它是dynamic类型对像
    从Asp.net MVC 1 就有了 ASP.NET MVC3 才有
    基于Asp.net 3.5 framework 基于Asp.net 4.0与.net framework
    ViewData比ViewBag快 ViewBag比ViewData慢
    在ViewPage中查询数据时须要转换合适的类型 在ViewPage中查询数据时不须要类型转换
    有一些类型转换代码 可读性更好

    Contorller

    <pre class="csharp" name="code">using NewOjbect.Models;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace NewOjbect.Controllers
    {
        public class HomeController : Controller
        {      
            public ActionResult Index()
            {
                ViewBag.UserName = "无盐海";
                ViewBag.Age = "25";
                ViewBag.Gender = 1;
    
                string[] Itmes = new string[] { "中国", "美国", "德国" };
                ViewBag.itemsA = Itmes;// viewbag是一个新的dynamic类型keyword的封装器 //ViewData["Items"] = items;
    			
                return View();                 
            }
        }
    }

    View

    <pre class="html" name="code"><html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Test2</title>
    </head>
    <body>
        <div>
            username:<input type="text" id="UserName" name="UserName" value="@ViewBag.UserName" /></br>
    
            年  龄: <input type="text" id="age" name="age" value=@ViewBag.Age /></br>
    
            性  别:<input type="text" id="Gender" name="Gender" value="@ViewBag.Gender" /></br>
    
            <button>提交</button>
    
            <!---这里输出国家名-->>
            @foreach (dynamic item in ViewBag.itemsA)
            {
                <p>@item</p>
            }
        </div>
    </body>
    </html>

    一、ViewBag的使用方法
    后台代码:

    public ActionResult Index()
    {
    Dictionary<string, string> address = new Dictionary<string, string>();
    address.Add("Lng", "12.353535");
    address.Add("Lat", "28.262626");
    address.Add("Location", "唐宁街十号");
    List<string> modules = new List<string>();
    modules.Add("Admin module");
    modules.Add("Recursive module");
    modules.Add("Consistent module");
    ViewBag.Name = "蝈蝈";
    ViewBag.Age = "18";
    ViewBag.Phone = "18233199999";
    ViewBag.Address = address;
    ViewBag.Modules = modules;
    return View();
    }

    前台代码:
    后台用ViewBag存值,前台既可以通过ViewBag取值,也可以通过ViewData取值。使用ViewData取值时,必须将数据转换成合适的类型;使用ViewBag取值时不需要转换数据类型。

    @ViewData["Name"]
    @ViewData["Age"]
    @ViewData["Phone"]
    @{
    Dictionary<string, string> dict = ViewData["Address"] as Dictionary<string, string>;
    }
    @if (dict != null)
    {
    @dict["Lng"]
    @dict["Lat"]
    @dict["Location"]
    }
    @{
    List<string> list = ViewData["Modules"] as List<string>;
    }
    @if (list != null)
    {
    @list[0]
    @list[1]
    @list[2]
    }
    <br/>
    @ViewBag.Name
    @ViewBag.Age
    @ViewBag.Phone
    @ViewBag.Address
    @ViewBag.Address["Lng"]
    @ViewBag.Address["Lat"]
    @ViewBag.Address["Location"]
    @ViewBag.Modules
    @ViewBag.Modules[0]
    @ViewBag.Modules[1]
    @ViewBag.Modules[2]

    二、ViewData的使用方法
    后台代码:

    public ActionResult Index()
    {
    Dictionary<string, string> address = new Dictionary<string, string>();
    address.Add("Lng", "12.353535");
    address.Add("Lat", "28.262626");
    address.Add("Location", "唐宁街十号");
    List<string> modules = new List<string>();
    modules.Add("Admin module");
    modules.Add("Recursive module");
    modules.Add("Consistent module");
    ViewData["Name"] = "蝈蝈";
    ViewData["Age"] = "18";
    ViewData["Phone"] = "18233199999";
    ViewData["Address"]=address;
    ViewData["Modules"] = modules;
    return View();
    }

    前台代码:
    后台用ViewData存值,前台既可以通过ViewBag取值,也可以通过ViewData取值。使用ViewData取值时,必须将数据转换成合适的类型;使用ViewBag取值时不需要转换数据类型。

    @ViewData["Name"]
    @ViewData["Age"]
    @ViewData["Phone"]
    @{
    Dictionary<string, string> dict = ViewData["Address"] as Dictionary<string, string>;
    }
    @if (dict != null)
    {
    @dict["Lng"]
    @dict["Lat"]
    @dict["Location"]
    }
    @{
    List<string> list = ViewData["Modules"] as List<string>;
    }
    @if (list != null)
    {
    @list[0]
    @list[1]
    @list[2]
    }
    <br/>
    @ViewBag.Name
    @ViewBag.Age
    @ViewBag.Phone
    @ViewBag.Address
    @ViewBag.Address["Lng"]
    @ViewBag.Address["Lat"]
    @ViewBag.Address["Location"]
    @ViewBag.Modules
    @ViewBag.Modules[0]
    @ViewBag.Modules[1]
    @ViewBag.Modules[2]

    三、两者的定义
    ViewBag的定义:

    public dynamic ViewBag {
    get {
    if (_dynamicViewData == null) {
    _dynamicViewData = new DynamicViewDataDictionary(() => ViewData);
    }
    return _dynamicViewData;
    }
    }

    ViewData的定义:

    public ViewDataDictionary ViewData {
    get {
    if (_viewData == null) {
    SetViewData(new ViewDataDictionary());
    }
    return _viewData;
    }
    set {
    SetViewData(value);
    }
    }

    通过定义我们可以看出ViewBag是ViewData的动态封装器,相当于在ViewData的基础上进行了封装处理。

    四、两者的区别
    ViewData是字典类型,赋值方式用字典方式,通过key值读取对应的value,ViewData[“myName”]
    ViewBag是动态类型,使用时直接通过属性赋值即可,ViewBag.myName
    ViewData和ViewBag只在当前Action中有效,等同于View
    ViewData和ViewBag中的值可以互相访问

    注意:
    1、只有当关键字是有效的C#标识符时,ViewBag才起作用。
    例如:如果在ViewData[“Key With Space”]中存放一个值,那么就不能使用ViewBag访问,因为这样根本无法通过编译。
    2、动态值不能作为一个参数传递给扩展方法,因为C#编译器为了选择正确的扩展方法,在编译时必须知道每一个参数的真正类型。如果其中任何一个参数是动态的,那么就不会通过编译。
    例如:@Html.TextBox(“name”,ViewBag.Name) 就会编译失败。
    要使这行代码通过编译有两种方法: @Html.TextBox(“name”,(string)ViewBag.Name) 、@Html.TextBox(“name”,ViewData[“Name”])

    五、简单总结
    遇到未知的东西不要着急,现在每天有那么多新知识面世,没有人能记住所有的知识点,只要能静下心来认真研究总能学会的,一定要相信自己能行,不要对自己设限。
    ---------------------
    作者:changuncle
    来源:CSDN
    原文:https://blog.csdn.net/xiaouncle/article/details/77825389
    版权声明:本文为博主原创文章,转载请附上博文链接!

    IT黑马
  • 相关阅读:
    Quartz.Net定时器
    Lucene.Net 实现搜索功能
    哈希表 STL map
    买卖股票的最佳时机I II III IV
    [离散化]人潮最多的時段( Interval Partitioning Problem )
    动态规划[入门]3-更难的矩阵取数问题
    动态规划[入门3]-多重背包问题
    动态规划[入门]2-循环数组最大子段和
    catalan卡塔兰数
    逆波兰表达式
  • 原文地址:https://www.cnblogs.com/hmit/p/11208280.html
Copyright © 2011-2022 走看看