《MVC》——ViewData、ViewBag、TempData、model

     在学习MVC的过程中,Controller里面向View传递数据很重要,我们在Controller里面讲数据加工以后,传递给View,然后让View将数据在浏览器上显示出来,这样我们就能在浏览器上看见了,但是从Controller向View中传递数据的方式有很多,包括ViewData、ViewBag、TempData、Model等等前面三个都是以弱类型的方式传递数据,最后的一个Model是以强类型的方式传递数据。下面我总结一下在学习的过程中它们传递数据的区别。

     我先说一下强类型方式传递数据和弱类型传递数据方式的区别,这仅仅是我自己的理解,对于ViewData、ViewBag、TempData这哥仨来说,以它三个为载体传递数据,不必考虑数据是什么类型的,它们可以接收很多类型的数据,像String、int、List<>等等,这些类型的数据都可以往上面那“哥三个”里面装;而强类型的数据传递方式就不同了,如果model的类型是List<String>,那么这个list里只能装String类型的数据,不能装int或者其它类型的数据。

     1、使用ViewData

     Controller代码

ViewData["Name"] = "赵大仙";//传递一个字符串类型的数据
            ViewData["Age"] = 25;//传递一个int类型的数据
            ViewData["Time"] = DateTime.Now;
            List<String> list = new List<string>();
            list.Add("字符串1");
            list.Add("字符串2");
            list.Add("字符串3");
            ViewData["list1"] = list;//传递一个List 

      视图中的代码 

<div>
        @ViewData["Name"]
        @ViewData["Age"]
    </div>
    <div>
        @ViewData["Time"]
    </div>
    <ul>
        @*使用ViewData传送过来的数据,在遍历的时候需要强制转化一下数据类型*@
        @foreach (var item in ViewBag.list1)
        {
            <li>
                @item     
            </li>   
        }
    </ul>

     2、使用ViewBag

     Controller中的代码

ViewBag.Name = "赵大仙";//传递一个字符串类型的数据
            ViewBag.Age = 25;//传递一个int类型的数据
            ViewBag.Time = System.DateTime.Now;
            List<String> list = new List<string>();
            list.Add("字符串1");
            list.Add("字符串2");
            list.Add("字符串3");
            ViewBag.list1 = list;//传递一个List </span>

      视图中的代码

<div>
        @ViewBag.Name
        @ViewBag.Age
    </div>
    <div>
        @ViewBag.Time
    </div>
    <ul>
        @*使用ViewData传送过来的数据,在遍历的时候需要强制转化一下数据类型*@
        @foreach (var item in ViewBag.list1)
        {
            <li>
                @item     
            </li>   
        }
    </ul>


     ViewData与View的比较

ViewData
ViewBag
View是Key/Value字典集合
它是Dynamic类型对象
ViewData在ASP.NET MVC 1就有的
ViewBag在ASP.NET MVC 3才有的
基于ASP.NET 3.5 Framework
基于ASP.NET 4.0 与 .NET  Framwork
ViewData比ViewBag快
ViewBag比ViewData慢
在ViewPage查询数据的时候需要转换为合适的数据类型
在ViewPage查询数据的时候不需要转换为合适的数据类型
有一些类型转换代码
可读性好

    
    3、使用TempData

    TempData用来:在一次请求中,同时执行多个Action方法时,在多个Action之间共享数据使用。

    主视图的Action代码

public ActionResult Index()
        {
            TempData["Ms1"] = "那谁...";
            return View();
        }

     主视图代码

<body>
   @*请求PartView方法*@
   @{Html.RenderAction("PartView");}  
</body>

    部分视图Action代码

public ActionResult PartView()
        {
            ViewData["Ms2"] = TempData["Ms1"] + "借我点钱!"; 
            return PartialView();
        }

    部分视图代码

<table>
    <tr>
        <td>@ViewData["Ms2"]</td>
    </tr>
</table>
   
    4、利用model传递数据

    Action中的代码

 public ActionResult Index()
        {
            List<String> list = new List<string>();
            list.Add("字符串1");
            list.Add("字符串2");
            list.Add("字符串3");
            return View(list);
        }

    视图中的代码

@model List<String>
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
</head>
<body>
   <div>
        @Html.TextBoxFor(a=>a[0])
   </div> 
   <div>
        @Html.TextBoxFor(a=>a[1])
    </div>
    @Html.TextBoxFor(a=>a[2])
</body>
</html>

     5、小结
    上面便是我在学习MVC过程中总结的由Controller向View传递数据的方式,这几种方式各有各的优势和特点,我们应该根据情况用,ViewData虽然传递数据快,但是相比较ViewBag它的可读性不好,而且ViewBag在ViewPage查询数据的时候不需要转换为合适的数据类型;可是ViewBag与ViewData在不同的Action请求中不能传递数据,这时候TempData就出来了;至于Model类型的,特别适合实体类型,比如说由数据库中的表映射成的实体,在View中绑定实体后,就可以随心所欲的将实体中的属性利用Lamda表达式加载出来了。


你可能感兴趣的:(《MVC》——ViewData、ViewBag、TempData、model)