控制器向视图传递数据的方法

Posted ecollab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了控制器向视图传递数据的方法相关的知识,希望对你有一定的参考价值。

 关于函数参数的传递方式:

 值传递:只是将参数值copy函数中,因此在函数中无法修改该参数的值。修改的只是传入参数的一份copy.

 引用传递:将参数地址传给函数,因此在函数中能修改该参数的值

http://blog.csdn.net/sknice/article/details/42323791

http://www.cnblogs.com/wenjiang/archive/2013/06/07/3123100.html

使用Model对象

介绍Razor语法,让我们从Index.cshtml文件的第一行开始:

@model MvcApplication1.Models.Product

Razor语句都是以@符号开始的。每个视图都有自己的Model属性(通过@Model调用)。上面这句代码的意思是将本视图的Model属性的类型指向MvcApplication1.Models.Product类型,这就实现了强类型。强类型的好处之一是类型安全,如果写错了Model对象的某个成员名,编译器会报错;另一个好处是在VS中可以使用VS中的代码智能提示自动完成类型成员调用的代码编写。 当然这句代码不要程序也可以正常运行,只是给编写代码造成了一定的困难。

视图中的Model属性用于存放控制器(Controller)传递过来的model实例对象(本示例中ProductController通过“return View(myProduct)”传递给Index视图),下面的代码演示了如何调用该model对象:

@model MvcApplication1.Models.Product

@{
    ViewBag.Title = "Index";
}
<!-- 调用Product实例的Name属性 -->
<h2>名称:@Model.Name</h2>

注意,第一行代码用于声名Model属性类型用的是@model <Model类型名>(小写m),而调用控制器传递过来的Model对象用的是@Model.<属性名>(大写M)。

 

 

1. 使用 ViewData 传递数据

Controller:ViewData["Name"]="代码里";

View:@(ViewData["Name"])

注:只在当前页面访问,无法跨页传递;

 

2. 使用TempData传递数据

Controller:TempData["Name"]="代码里";

View:@(TempData["Name"])

注:保存在Session中,可以实现跨页传递,且传递一次之后自动删除(只能使用一次)

 

3. 使用Model传递数据

Controller:Person person=new Person(){Name="代码里"};

return View(person);

View:@model Person

@(Model.Name)

通过强类型视图直接传递实例化对象

上一次只讲了上面3种方式,第四种是Co君常用的一种传值方式:ViewBag,经常用给不小心漏掉了,非常抱歉

 

4. 使用ViewBag传递数据

ViewBag是dynamic类型对象,所以使用时不需要进行类型的转换,性能上比ViewData要稍微差一点点,但是应该大多数人都喜欢用ViewBag,不论从书写还是可读性来说,ViewBag都略胜一筹

    

在"Home" 控制器的Index()动作方法中,设置ViewBag属性值。

namespace MvcApplication1:Controllers{     public class HomeController:Controller    {        public ActionResult  Index()        {            ViewBag.Name="代码里";            ViewBag.Ads="www.daimali.com";            ViewBag.person=new Person{name="李四",sex="男"};            return View();        }    }}

示例中我们可以直接通过 【ViewBag.自定义属性】,用法非常方便。

<html><head></head><body>    站点名称:@(ViewBag.Name)    网站地址:@(ViewBag.Ads)     所属人:@(ViewBag.person.name)     性别:  @(ViewBag.person.sex)</body></html>

使用时不需要进行类型的转换即可直接调用。同时它和ViewData一样,都只在当前页面访问,无法实现跨页传递。

 

TempData也是字典,所以它的使用完全等同于ViewData,但两者之间还是存在很大的差异。

     TempData,顾名思义,就是临时数据。TempData保存在Session中,Controller每次请求的时候都会从Session中获取TempData,然后清除Session。基于这样的事实,在每次请求结束后,TempData的生命周期也就结束了。网上有一句话:TempData至多之只能通过一次Controller传递,假设我们的Controller是跳转到下一个Controller,以此类推,在最后一个Controlle相应的视图上,的确可以获得该TempData。但是,这并不是说TempData已经跨请求传递了,这依然只是一次请求,至于是否是跨Controller传递,我认为不是,所谓的通过Controller传递,是指将TempData传递给View,在上面的例子中,只有最后的Controller才会将该TempData传递给View,所以,TempData的确是只能通过一次Controller传递。

      TempData也可以在Action之间传递的,像是这样:

复制代码
public ActionResult Index()
{
    TempData["message"] = "Hello";
    return View();
}

public ActionResult About()
{
    if ("Hello" == TempData["message"] as string)
    {
         TempData["message"] = "Hello,Word";
    }
    return View();
}
复制代码

      但必须注意,要使该行为正确,也就是TempData能够被传递给另一个Action,Index操作对应的视图就不能使用TempData,因为一旦使用就相当于一次请求,那么TempData中的值就会被清空。

      TempData是存储在Session中,但这个并不是绝对的,我们可以改变TempData的存储地方,只要实现ITempDataProvider这个接口就行,但一般情况没有必要这么做。 

以上是关于控制器向视图传递数据的方法的主要内容,如果未能解决你的问题,请参考以下文章

MVC 数据传递

控制器向视图传递数据

5.MVC框架开发(强类型开发,控制器向界面传递数据的几种方法)

向前传递后如何将数据向后传递给视图控制器?

编辑 NEW 使用 HttpPost 将数据从控制器传递到视图

ASP.Net Core 3.1 - 从控制器向部分视图模态传递值?