• MVC Controller向View传值(ViewData与ViewBag)



    近期在开发项目中,使用的是ASP.NET MVC因为之前并没有接触,对于它的传值方式有些陌生,在这里进行初步总结积累学习。

     

    一:使用

     

    ViewData使用:

    public ActionResult Index()
    {
    	List<string> colors = new List<string>();
    	colors.Add("red");
    	colors.Add("green");
    	colors.Add("blue");
    	ViewData["listColors"] = colors;
    	ViewData["dateNow"]= DateTime.Now;
    	ViewData["name"] = "hejingyuan";
    	ViewData["age"]= 25;
    	return View();
    }
    

    View

    <p>
    	My name is <b>@ViewData["name"] </b>,<b>@ViewData["age"] </b>years old.
    	<br />
    	I like the following colors:
    </p>
    <ul id="colors">
    	@foreach (var color in ViewData["listColors"] as List<string>)
    	{
    	<li><font color="@color">@color </font></li>
    	}
    </ul>
    <p>
    	@ViewData["dateNow"]
    </p>
    

    ViewBag使用:

    public ActionResult Index()
    {
    	List<string>colors = new List<string>();
    	colors.Add("red");
    	colors.Add("green");
    	colors.Add("blue");
    	ViewBag.ListColors = colors; //colors is List
    	ViewBag.DateNow= DateTime.Now;
    	ViewBag.Name= "hejingyuan";
    	ViewBag.Age = 25;
    	return View(); 
    }
    

    View

    <p>
    	My name is <b>@ViewBag.Name</b>, <b>@ViewBag.Age</b> years old.
    	<br />
    	I like the following colors:
    </p>
    <ul id="colors">
    	@foreach (var color in ViewBag.ListColors)
    	{
    	<li><font color="@color">@color</font> </li>
    	}
    </ul>
    <p>
    	@ViewBag.DateNow
    </p>
    

    在使用上。我们能够非常明显的看出这两种方式的差别,仅仅是存取值得方式有些差别而已!

     

    二。定义

     

    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与ViewBag的差别

     

    1、ViewData是字典类型,赋值方式用字典方式,通过key值读取相应的value,ViewData["myName"]

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

    3、ViewBag和ViewData仅仅在当前Action中有效,等同于View

    4、ViewData和ViewBag中的值能够互相訪问,由于ViewBag的实现中包括了ViewData

     

    注意:

     

    1,仅仅有当要訪问的keyword是一个有效的C#标识符时。ViewBag 才起作用。

     

    比如。假设在ViewData["Key With Spaces"]中存放一个值,那么就不能使用ViewBag訪问。由于这样根本就无法通过编译。

    2。动态值不能作为一个參数传递给扩展方法。

    由于C#编译器为了选择正确的扩展方法,在编译时必须知道每个參数的真正类型。

    假设当中不论什么一个參数是动态的,那么就不会通过编译。

    比如,这行代码就会编译失败:@Html.TextBox("name",ViewBag.Name)。要使这行代码通过编译有两种方法:第一是使用ViewData["Name"],第二是把ViewBag.Name值转换为一个详细的型:(string)ViewBag.Name 。

     

    四:总结

     

    对于传值方式这个话题。对于大家来说应该是有些老套。由于仅仅要接触过项目的人都非常了解,这是一个非常基础的知识。在这里列出来,基本的目的也不是说要告诉大家怎样怎样传值,怎样怎样操作。然后要求大家记下来等,而是要通过上面的知识,告诉大家事实上知识并没有我们想的那么高深莫測,全部的知识即使我们没有听说过,但仅仅要我们花一些时间去研究,去总结,那么一切困难都变得easy了。

     




  • 相关阅读:
    转载:生产级实践之集群搭建方案系列PostgreSQL主从部署搭建与配置 规格严格
    在my.cnf中设置lower_case_table_names = 1 无效的解决方法【转载】 规格严格
    Druid sql解析 规格严格
    powa 规格严格
    【snmp】snmpwalk 指定端口 规格严格
    Chrome您的连接不是私密连接解决办法 规格严格
    MEF程序设计指南九:重组(Recomposition)MEF部件
    MEF程序设计指南八:部件生命周期(Parts Lifetime)托管
    项目管理学习笔记二:信息系统服务管理
    项目管理学习笔记一:信息化知识
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5132920.html
Copyright © 2020-2023  润新知