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

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这个接口就行,但一般情况没有必要这么做。

时间: 2024-08-24 19:29:08

控制器向视图传递数据的方法的相关文章

控制器向视图传递数据

1.ViewData:可存放任意类型数据,使用时需要转换,ViewData[“Info”]="hello",适合传递单个数据: 2.ViewBag:是对ViewData的封装,可读取ViewData保存的数据,反之亦然,ViewBag.stu=objStudent: 3.TempData:可跨视图,跨控制器传,跨动作方法之间传递数据,使用时需要转换数据类型,TempData["admin"]=objAdmin;临时保  存数据,一旦使用,则被清除: 4.View()

控制器之间传递数据的方法(segue)

在登陆界面,点击登陆,验证账号密码,之后跳转到下一个窗口.用户的数据从第一个控制器传递到下一个控制器.实现方法如下: /**点击登陆按钮*/ - (IBAction)login { //账号:qqq    密码:www     if(![self.accountField.text isEqualToString:@"qqq"]){         [MBProgressHUD showError:@"用户名不存在.."];    //MBProgressHUD为之

在ViewController之间传递数据的方法【iOS】

在ViewController之间传递数据的方法有不少,博主这里总结两种最常用的方法给大家: 我们假设有 视图控制器A 和 视图控制器B,其中我们设视图控制器B 是由 视图控制器A通过Navigation controller Push过去的,也就是说视图控制器B是视图控制器A的子视图控制器. 下面我们就分别通过 A->B 和 B->A传递数据说明两种在视图控制器之间传递数据的方法. 1.由视图控制器A传递数据给视图控制器B 这里,我的视图控制器A是 ViewController 视图控制器B

Android 开发中使用Intent传递数据的方法

Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short[].int.int[].long.long[].float.float[].double.double[].String.String[],还有采用实现Serializable.Parcelable接口的类对象传递数据的两种方法:一种是Bundle.putSerializable(Key,Obje

spring的控制器如何传递数据到视图

1.控制器代码 2.传递数据代码 model.addAttribute("name", name); 通过model对象传递 原文地址:https://www.cnblogs.com/max-hou/p/11093690.html

Intent传递数据的方法

一.传递List 1.传递List<String>的方法 ArrayList<String> info = new ArrayList<String>(); info.add(weibo); Intent intent = new Intent(MainActivity.this, ResultActivity.class); intent.putStringArrayListExtra("infoList", info); startActivit

laravel如何向视图传递变量的方法

第一种: public function about(){ $name = "cai" return view("sites.about")->with('name',$name);} public function about(){ return view("sites.about")->with([ 'first' =>'jelly', 'last' =>'cai' ]); } 第二种: public function

JavaScrip ajaxt和python flask通过json传递数据的方法

JavaScript调用ajax发送一个json $('#cc').click(function () { mdffilepath = { 'name1': 'aaaa1','name2': 'aaaa2','name3': 'aaaa3','name4': 'aaaa4'//要发送的字典,在JavaScript里被定义为对象 }; //传输数据 $.ajax({ type: 'POST', url: '/calc/read_inca_func', data: JSON.stringify(md

MVC学习系列9--从视图向控制器传递数据

前面学习了,从控制器向视图传递数据,现在学习怎么从视图向控制器传递数据. 通常,我们有两种方式,来处理浏览器的请求,一个是GET方式,一个是POST方式.一般来说,直接通过在浏览器中输入URL话,请求的方式是GET,那么GET方式的Action方法将会被调用,另一方面,如果是点击一个Button提交一个表单的话,这个时候POST方式的Action就会被调用. 这里我们说的是POST方式,怎么从视图向控制器传递数据,即把用户输入的表单信息的数据,传递到控制器对应的Action方法中. 这里先列举一