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黑马
  • 相关阅读:
    mysql复制那点事
    全排列问题
    56. Merge Interval
    2. Add Two Numbers
    20. Valid Parentheses
    121. Best Time to Buy and Sell Stock
    120. Triangle
    96. Unique Binary Search Trees
    91. Decode Ways
    72. Edit Distance
  • 原文地址:https://www.cnblogs.com/hmit/p/11208280.html
Copyright © 2011-2022 走看看