ASP.NET MVC3中Controller与View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练、灵活的掌握这两层之间的数据传递方法就非常重要。本文从两个方面进行探讨:
一、 Controller向View传递数据
1. 使用ViewData传递数据
我们在Controller中定义如下:
- ViewData[“Message_ViewData”] = “ Hello ViewData!”;

ViewData[“Message_ViewData”] = “ Hello ViewData!”;
然后在View中读取Controller中定义的ViewData数据,代码如下:
- @Html.Encode(ViewData["Message_ViewData"])

@Html.Encode(ViewData["Message_ViewData"])
js中读取ViewData中数据如下:
- <pre name="code" class="javascript"><script type="text/javascript">
- var viewData = '@ViewData["Message_ViewData"]';
- </script>

<pre name="code" class="javascript"><script type="text/javascript">
var viewData = '@ViewData["Message_ViewData"]';
</script>
2. 使用ViewBag传递数据
我们在Controller中定义如下:
- ViewBag.Message_ViewBag = “ Hello ViewBag !”;

ViewBag.Message_ViewBag = “ Hello ViewBag !”;
然后在View中读取Controller中定义的ViewBag数据,代码如下:
- @Html.Encode(ViewBag.Message_ViewBag)

@Html.Encode(ViewBag.Message_ViewBag)
js中读取ViewBag中数据如下:
- <script type="text/javascript">
- var viewBag= '@ViewBag.Message_ViewBag';
- </script>

<script type="text/javascript">
var viewBag= '@ViewBag.Message_ViewBag';
</script>
3. 使用TempData传递数据
我们在Controller中定义如下:
- TempData[“Message”] = “Hello word!”;

TempData[“Message”] = “Hello word!”;
然后在View中读取Controller中定义的TempData数据,代码如下:
- @Html.Encode(TempData["Message_TempData"])

@Html.Encode(TempData["Message_TempData"])
js中读取TempData中数据如下:
- <script type="text/javascript">
- var tempData = '@TempData["Message"]';
- </script>

<script type="text/javascript">
var tempData = '@TempData["Message"]';
</script>
4. 使用Model传递数据
首先要创建Model实体类:
- public class HelloModel
- {
- private string _name;
- public string Name
- {
- get { return _name; }
- set { _name = value; }
- }
- private string _text;
- public string Text
- {
- get { return _text; }
- set { _text = value; }
- }
- }

public class HelloModel
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private string _text;
public string Text
{
get { return _text; }
set { _text = value; }
}
}
使用Model传递数据的时候,通常在创建View的时候我们会选择创建强类型View如下图所示:
模型类下拉列表框中选中刚才创建的HelloModel 创建强类型的View以后,View的第一行代码如下所示:
- @model Test.Models.HelloModel

@model Test.Models.HelloModel
就代表了这个View使用的Model为“Test.Models.HelloModel” 然后在View中读取Model中定义的数据,代码如下:
- @Html.Encode(Model.Name)

@Html.Encode(Model.Name)
js中读取Model中数据如下:
- <script type="text/javascript">
- var modelName = '@Model.Name';
- </script>

<script type="text/javascript">
var modelName = '@Model.Name';
</script>
总结:
1. ViewData与TempData方式是弱类型的方式传递数据,而使用Model传递数据是强类型的方式。 2. ViewData与TempData是完全不同的数据类型,ViewData数据类型是ViewDataDictionary类的实例化对象,而TempData的数据类型是TempDataDictionary类的实例化对象。 3. TempData实际上保存在Session中,控制器每次执行请求时都会从Session中获取TempData数据并删除该Session。TempData数据只能在控制器中传递一次,其中的每个元素也只能被访问一次,访问之后会被自动删除。 4. ViewData只能在一个Action方法中进行设置,在相关的视图页面读取,只对当前视图有效。理论上,TempData应该可以在一个Action中设置,多个页面读取。但是,实际上TempData中的元素被访问一次以后就会被删除。 5. 在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData。MVC3中保留了ViewData的使用,有关他们之间的区别可以参考这个文章。
MVC3中 ViewBag、ViewData和TempData的使用和区别
二、 View向Controller传递数据
在ASP.NET MVC中,将View中的数据传递到控制器中,主要通过发送表单的方式来实现。具体的方式有:
1. 通过Request.Form读取表单数据
我们在View层做如下定义:
- @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
- {
- @Html.TextBox("Name");
- @Html.TextBox("Text");
- <input type="submit" value="提交" />
- }

@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
{
@Html.TextBox("Name");
@Html.TextBox("Text");
<input type="submit" value="提交" />
}
注意: HelloModelTest为对应的Action名,Home为对应的Controller名称 然后在Controller层,通过Request.Form读取表单数据的代码如下所示:
- [HttpPost]
- public ActionResult HelloModelTest()
- {
- string name= Request.Form["Name"];
- string text= Request.Form["Text"];
- return View();
- }

[HttpPost]
public ActionResult HelloModelTest()
{
string name= Request.Form["Name"];
string text= Request.Form["Text"];
return View();
}
2. 通过FormCollection读取表单数据
我们在View层做如下定义:
- @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
- {
- @Html.TextBox("Name");
- @Html.TextBox("Text");
- <input type="submit" value="提交" />
- }

@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
{
@Html.TextBox("Name");
@Html.TextBox("Text");
<input type="submit" value="提交" />
}
然后在Controller层,通过FormCollection读取表单数据的代码如下所示:
- [HttpPost]
- public ActionResult HelloModelTest(FormCollection fc)
- {
- string name= fc["Name"];
- string text = fc["Text"];
- return View();
- }

[HttpPost]
public ActionResult HelloModelTest(FormCollection fc)
{
string name= fc["Name"];
string text = fc["Text"];
return View();
}
3. 模型绑定
我们在View层做如下定义:
- @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
- {
- @Html.TextBox("Name");
- @Html.TextBox("Text");
- <input type="submit" value="提交" />
- }

@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
{
@Html.TextBox("Name");
@Html.TextBox("Text");
<input type="submit" value="提交" />
}
默认的模型绑定
相较于从请求中获取表单值,下面的Edit Action则是简单地以一个模型对像为参数(Album):
- [HttpPost]
- public ActionResult HelloModelTest( HelloModel model)
- {
- // ...
- }

[HttpPost]
public ActionResult HelloModelTest( HelloModel model)
{
// ...
}
当你的Action方法是以一个模型对象充当参数时,MVC运行时将会用模型绑定来构建该参数。默认用于模型绑定的是 DefaultModelBinder,以上述的HelloModel为例,DefaultModelBinder将会检索出所有可用的HelloModel属性用于绑定模型。根据命名约定,DefaultModelBinder能够自动地在请求中获取相应的值来填充HelloModel对象(它还能创建一个对象的实例来填充) 换句话说,假设HelloModel有一个Name属性,那么模型绑定就会在请求中查找名为Name的参数。注意我说的是在“请求中”,而不是“表单集合”中。模型绑定会在请求中的各个方面进行值查找,这里面包括路由数据,查询字符串,表单集合。有必要的话你还可以添加自定义的值提供信息。 模型绑定不并局限于Http Post及复杂参数(如HelloModel),你完全可以传入一个原始的简单参数:
- public ActionResult HelloModelTest( string name,string text)
- // ….

public ActionResult HelloModelTest( string name,string text)
{
// ….
}
在该场景中,模型绑定将会在请求中查找名为name,text 的参数。
显式模型绑定
当Action有参数的时候,会隐式地执行模型绑定。你还可以在控制器里面使用UpdateModel和 TryUpdateModel来显式调用模型绑定。调用UpdateModel的时候,如果模型对象是无效的或者绑定期间发生错误则会抛出异常。TryUpdateModel则不会抛出异常,它返回一个布尔值:如果绑定成功并且模型验证通过则返回true,否则返回false。
- [HttpPost]
- public ActionResult HelloModelTest( )
- {
- HelloModel model = new HelloModel();
- if (this.TryUpdateModel(model))
- {
- //绑定成功
- }
- else
- {
- //绑定失败
- }
- }

[HttpPost]
public ActionResult HelloModelTest( )
{
HelloModel model = new HelloModel(); if (this.TryUpdateModel(model))
{
//绑定成功
}
else
{
//绑定失败
}
}
模型状态是模型绑定产生的副产物。每次绑定器绑定值到模型时,都会在模型状态中进行记录。你可以在模型绑定之后查看模型状态来判断绑定是否成功:
- [HttpPost]
- public ActionResult HelloModelTest( )
- {
- HelloModel model = new HelloModel();
- this.TryUpdateModel(model);
- if (ModelState.IsValid)
- {
- //绑定成功
- }
- else
- {
- <pre code_snippet_id="569649" snippet_file_name="blog_20150102_21_3590846" name="code" class="csharp"><span style="white-space:pre"> </span>//绑定失败

[HttpPost]
public ActionResult HelloModelTest( )
{
HelloModel model = new HelloModel();
this.TryUpdateModel(model);
if (ModelState.IsValid)
{
//绑定成功
}
else
{
<pre code_snippet_id="569649" snippet_file_name="blog_20150102_21_3590846" name="code" class="csharp"><span style="white-space:pre"> </span>//绑定失败
}}
如果在模型绑定过程中发生异常,模型状态里面就会包含导致异常的那个属性名,绑定值以及错误信息。
ASP.NET MVC3中Controller与View之间的数据传递的更多相关文章
- ASP.NET MVC3中Controller与View之间的数据传递总结
一. Controller向View传递数据 1. 使用ViewData传递数据 我们在Controller中定义如下: ViewData["Message_ViewData& ...
- Asp.net MVC中 Controller 与 View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...
- MVC中Controller与View之间的数据传递
一.Controller向View传递数据 Controller向View传递数据有3种形式: 通过ViewData传递 在Controller里面的Action方法中定义ViewData,并且赋值, ...
- MVC中Controller与View中间的数据传递的常用方法
这几天正在学习MVC,顺便就将自己每天的学习心得记录下来与大家分享一下吧! 在MVC中,Controller与View之间传递数据是很频繁的事情,所以在这里就总结一下我自己在学习中使用的几种常用的方法 ...
- Controller与View之间的数据传递
1)Controller向View传递数据ViewData["message"] = "Hello";//使用ViewData传递数据ViewBag.Time ...
- Asp.Net MVC中Controller与View之间传递的Model
Controller --> View 的Model 与 提交表单后 View --> Controller 的Model 不是相同的对象,即:这两个Model为不同的指针,指向不同的地址 ...
- ASP.NET MVC中controller和view相互传值的方式
ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...
- iOS开发中视图控制器ViewControllers之间的数据传递
iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...
- ASP.NET MVC 之控制器与视图之间的数据传递
今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...
随机推荐
- [Computational Advertising] 计算广告学笔记之基础概念
因为工作需要,最近一直在关注计算广告学的内容.作为一个新手,学习计算广告学还是建议先看一下刘鹏老师在师徒网的教程<计算广告学>. 有关刘鹏老师的个人介绍:刘鹏现任360商业产品首席架构师, ...
- 添加Silverlight应用到HTML
Silverlight是跨浏览器,跨客户平台的浏览器插件,可以应用在Windows,Linux,Mac等平台.作为浏览器插件,Silverlight可以像Flash一样,很方便的嵌套在HTML页面中, ...
- HTML5 Canvas 绘图
首先要注意: <canvas> 元素不被一些老的浏览器所支持, 但被支持于Firefox 1.5+, Opera 9+, 新版本的Safari, Chrome, 以及Internet Ex ...
- 安卓中AIDL的使用方法快速入门
1.AIDL是什么? AIDL全称是Android Interface Definition Language,即安卓接口定义语言. 2.AIDL是用来做什么的?(为什么要有AIDL) AIDL是用来 ...
- css负边距之详解
自从1998年CSS2作为推荐以来,表格的使用渐渐退去,成为历史.正因为此,从那以后CSS布局成为了优雅代码的代名词. 对于所有设计师使用过的CSS概念,负边距作为最少讨论到的定位方式要记上一功.这就 ...
- 连载 [ LTS + Top ]
+---[ LTS List ]--->| 1. 每日被自己坑的debugging.. http://www.cnblogs.com/tmzbot/p/5582302.html| 2. [待添加 ...
- visual studio installer 打包123
下载安装visual studio installer
- Python flask @app.route
转载自 http://python.jobbole.com/80956/ 下面是Flask主页给我们的第一个例子,我们现在就由它入手,深入理解“@app.route()”是如何工作的. ...
- xcode 8 重新支持插件
苹果出了Xcode8之后,就加了签名让之前的自定义插件无法继续的安装使用.想要重新使用插件的话只要用自己的签名覆盖苹果的签名即可. 1.创建自签名证书 钥匙串->钥匙串访问->证书助理-& ...
- svn上传工程之后下载,打开下载之后的工程缺少文件
当我们把iOS的工程上传到SVN中,当我们再从SVN中下载下来,就会出现错误,这是什么原因呢?我这里出现的错误是找不到文件,后来知道原来是被屏蔽掉了,就是上传的时候不上传某个类型的文件.例如我出错就是 ...