zoukankan      html  css  js  c++  java
  • 总结Controller向View传值的方式(转)

    总结发现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、ViewData、TempData之间的差别:

    ViewData与ViewBag之间非常相似,两者使用的场景基本一致,但是ViewData的类型是很明确的,使用的时候经常需要强制类型转换,而ViewBag的类型是动态的,不确定的,直接就可以使用,他们的传值范围是:controller向view传值,view自己和自己传值。而TempData存在的目的就是为了防止redirect时候数据的丢失,所以它的传值范围是当前controller和跳转后的controller之间。

    下面来详细的讲述他们的具体用法:

    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>
  • 相关阅读:
    【CF-148E】Porcelain DP
    【CF-687C】The Values You Can Make 01背包变形
    【CF-269】B. Greenhouse Effect 最公共子序列
    【CF-1345】C.Hilbert's Hotel 数论
    【CF-607B】Zuma 经典区间DP
    【【模板】三分法】
    【CF-1355 E.Restorer Distance】三分,贪心
    【CF-1355 BCount Triangles】枚举
    【CF-1355 Sequence with Digits】
    触发器的类型有哪三种?
  • 原文地址:https://www.cnblogs.com/dayang12525/p/6042345.html
Copyright © 2011-2022 走看看