zoukankan      html  css  js  c++  java
  • 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控制器

    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();

    control 控制器

    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(); 
    
    }

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

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

    ViewBag                                                                                    

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

    1、conroller向view传值

    2、view向view传值:

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

    ViewData                                                                                  

    1、ViewData的基本用法

    2、ViewData 转换成 ViewBag:

    3、ViewBag 转换成 ViewData:

    TempData                                                                                

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

     
    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);
    }

     普通页面传递model: 

    //Action代码
    public ActionResult Index()
    {
      Product p = new Product();
      p.Name = "Toy";
      return View(p);
    }
     
    
    在View中调用的代码: 
    Product : <%: ((Product)Model).Name %>

    向强类型试图传递model                                                             

     1、WebForm Engine的试图的实现:

    //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>

    2、Razor Engine的实现:

    在Razor中声明类型的方式:
    @model Mvc3App.Models.Product
     
    在Razor中调用对象的方式:
    <h2> Product: @Model.Name </h2>
     
  • 相关阅读:
    开发模型----快速原型模型
    开发模型--瀑布模型
    python_001
    Linux文件的类型与系统目录
    流程控制语句
    test命令
    排序sort && 取消重复行uniq
    sed命令——用来对文件数据的 选取、替换、删除
    颜色RGB大全
    Markdown的使用
  • 原文地址:https://www.cnblogs.com/zyh-club/p/4941576.html
Copyright © 2011-2022 走看看