MVC 向页面传值方式总结(2)

原文:MVC 向页面传值方式总结(2)

MVC 向页面传值方式总结

总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是:

  • ViewBag
  • ViewData
  • TempData
  • 向普通View页面传一个Model对象
  • 向强类型页面传传一个Model对象
  • 用一个ViewModel对象解决所有问题

 

     首先我们需要明确的是我们从controller向view传值的时候,这些方式分别处于什么样的地位:

     我们一般会向页面传递一个主要的类型的数据,一般是情况下是一个List<Model>,如果只有这个,很好办,一个model对象就解决了,但是往往除此之外还会有一些额外的零散的数据需要传递,比如分页的pageIndex,或者pageCount等等,这样的数据用原有的model就无能为力了,这时候,我们就可以用ViewBag、ViewData、TempData来传递这些额外的数据。

     视图数据可以通过ViewBag属性访问,它主要是为了从Controller到view进行传值用的,类似有所使用的ViewData[] 字典类。对于ViewBag是如此的强大,意味着你能动态的set/get 值,增加任何数量的的额外字段而不需要强类型的检测。如:

control控制器

MVC 向页面传值方式总结(2) MVC 向页面传值方式总结(2)
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"]
 = "Hajan";

ViewData["age"]
 = 25;



return 
View();
MVC 向页面传值方式总结(2) MVC 向页面传值方式总结(2)

 

control 控制器

 

MVC 向页面传值方式总结(2) MVC 向页面传值方式总结(2)
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
 = "Hajan";

ViewBag.Age
 = 25;

return 
View(); 

}
MVC 向页面传值方式总结(2) MVC 向页面传值方式总结(2)

你和上面的对比 你看见了不同吗?

  View 对应前台视图:

1.使用ViewData

<p> My name is <b>@ViewData["name"] </b>, <b> <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>

2.使用ViewBag

<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> 效果图: MVC 向页面传值方式总结(2)MVC 向页面传值方式总结(2)   ViewBag、ViewData 和 TempData 的区别: ViewData 和 TempData 都可以传递弱类型数据,区别如下: ViewData 只在当前 Action 中有效,生命周期和 View 相同; TempData 的数据至多只能经过一次Controller传递,并且每个元素至多只能被访问一次,访问以后,自动被删除。 TempData 一般用于临时的缓存内容或抛出错误页面时传递错误信息,可以将TempData 在使用之前存储到相应的 ViewData 中以备循环使用。  

ViewBag                                                                                    

我们可以认为 ViewBag=ViewData+Dynamic wrapper around the ViewData ,接下来你就可以体会到这个公式的含义了。

1、conroller向view传值

MVC 向页面传值方式总结(2)

 

2、view向view传值:

MVC 向页面传值方式总结(2)

 

3、利用ViewBag传递一个对象:

MVC 向页面传值方式总结(2)

 

 

 

ViewData                                                                                  

1、ViewData的基本用法

MVC 向页面传值方式总结(2)

 

2、ViewData 转换成 ViewBag:

MVC 向页面传值方式总结(2)

 

3、ViewBag 转换成 ViewData:

MVC 向页面传值方式总结(2)

 

 

 

TempData                                                                                

TempData用于在Redirect的时候保存数据,ViewData、ViewBag在跳转后就会变成null,但是TempData不会,下面是TempData的用法示例:

 

MVC 向页面传值方式总结(2) MVC 向页面传值方式总结(2)
public ActionResult Index()
{
  var model = new Review()
            {
                Body = "Start",
                Rating=5
            };
    TempData["ModelName"] = model;
    return RedirectToAction("About");
}
<pre><pre lang="cs">public ActionResult About()
{
    var model= TempData["ModelName"];
    return View(model);
}
MVC 向页面传值方式总结(2) MVC 向页面传值方式总结(2)

 普通页面传递model: 

MVC 向页面传值方式总结(2) MVC 向页面传值方式总结(2)
//Action代码
public ActionResult Index()
{
  Product p = new Product();
  p.Name = "Toy";
  return View(p);
}
 

在View中调用的代码: 
Product : <%: ((Product)Model).Name %>
MVC 向页面传值方式总结(2) MVC 向页面传值方式总结(2)

 

向强类型试图传递model                                                             

 1、WebForm Engine的试图的实现:

MVC 向页面传值方式总结(2) MVC 向页面传值方式总结(2)
//Aciton的代码
public ActionResult Index()
{
  Product p = new Product();
  p.Name = "Toy";
  return View(p);
}


View中的代码
声明类型
<%@ Page Inherits="System.Web.Mvc.ViewPage<Product>" %>

直接用Model调用该对象
<h2> Product Name: <%: Model.Name %> </h2>
MVC 向页面传值方式总结(2) MVC 向页面传值方式总结(2)

2、Razor Engine的实现:

在Razor中声明类型的方式:
@model Mvc3App.Models.Product
 
在Razor中调用对象的方式:
<h2> Product: @Model.Name </h2>
上一篇:Python基础


下一篇:Flutter 中 Padding、Row 、Column 、Expanded 组件详解