一、  Controller向View传递数据

1.       使用ViewData传递数据

我们在Controller中定义如下:

  1. ViewData[“Message_ViewData”] = “ Hello ViewData!”;
ViewData[“Message_ViewData”] = “ Hello ViewData!”;

然后在View中读取Controller中定义的ViewData数据,代码如下:

  1. @Html.Encode(ViewData["Message_ViewData"])
@Html.Encode(ViewData["Message_ViewData"])

js中读取ViewData中数据如下:

  1. <pre name="code" class="javascript"><script type="text/javascript">
  2. var viewData = '@ViewData["Message_ViewData"]';
  3. </script>
<pre name="code" class="javascript"><script type="text/javascript">
var viewData = '@ViewData["Message_ViewData"]';
</script>


2.       使用ViewBag传递数据

我们在Controller中定义如下:

  1. ViewBag.Message_ViewBag =  “ Hello ViewBag !”;
ViewBag.Message_ViewBag =  “ Hello ViewBag !”;

然后在View中读取Controller中定义的ViewBag数据,代码如下:

  1. @Html.Encode(ViewBag.Message_ViewBag)
@Html.Encode(ViewBag.Message_ViewBag)

js中读取ViewBag中数据如下:

  1. <script type="text/javascript">
  2. var viewBag= '@ViewBag.Message_ViewBag';
  3. </script>
<script type="text/javascript">
var viewBag= '@ViewBag.Message_ViewBag';
</script>

3.       使用TempData传递数据

我们在Controller中定义如下:

  1. TempData[“Message”] = “Hello word!”;
TempData[“Message”] = “Hello word!”;

然后在View中读取Controller中定义的TempData数据,代码如下:

  1. @Html.Encode(TempData["Message_TempData"])
@Html.Encode(TempData["Message_TempData"])

js中读取TempData中数据如下:

  1. <script type="text/javascript">
  2. var tempData = '@TempData["Message"]';
  3. </script>
<script type="text/javascript">
var tempData = '@TempData["Message"]';
</script>

4.   使用Model传递数据

首先要创建Model实体类:

  1. public class HelloModel
  2. {
  3. private string _name;
  4. public string Name
  5. {
  6. get { return _name; }
  7. set { _name = value; }
  8. }
  9. private string _text;
  10. public string Text
  11. {
  12. get { return _text; }
  13. set { _text = value; }
  14. }
  15. }
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的第一行代码如下所示:

  1. @model Test.Models.HelloModel
@model Test.Models.HelloModel

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

  1. @Html.Encode(Model.Name)
@Html.Encode(Model.Name)

js中读取Model中数据如下:

  1. <script type="text/javascript">
  2. var modelName = '@Model.Name';
  3. </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层做如下定义:

  1. @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
  2. {
  3. @Html.TextBox("Name");
  4. @Html.TextBox("Text");
  5. <input type="submit" value="提交" />
  6. }
@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
{
@Html.TextBox("Name");
@Html.TextBox("Text");
<input type="submit" value="提交" />
}

注意: HelloModelTest为对应的Action名,Home为对应的Controller名称 然后在Controller层,通过Request.Form读取表单数据的代码如下所示:

  1. [HttpPost]
  2. public ActionResult HelloModelTest()
  3. {
  4. string name= Request.Form["Name"];
  5. string text= Request.Form["Text"];
  6. return View();
  7. }
 [HttpPost]
public ActionResult HelloModelTest()
{
string name= Request.Form["Name"];
string text= Request.Form["Text"];
return View();
}

2.  通过FormCollection读取表单数据

我们在View层做如下定义:

  1. @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
  2. {
  3. @Html.TextBox("Name");
  4. @Html.TextBox("Text");
  5. <input type="submit" value="提交" />
  6. }
@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
{
@Html.TextBox("Name");
@Html.TextBox("Text");
<input type="submit" value="提交" />
}

然后在Controller层,通过FormCollection读取表单数据的代码如下所示:

  1. [HttpPost]
  2. public ActionResult HelloModelTest(FormCollection fc)
  3. {
  4. string name= fc["Name"];
  5. string text  = fc["Text"];
  6. return View();
  7. }
[HttpPost]
public ActionResult HelloModelTest(FormCollection fc)
{
string name= fc["Name"];
string text = fc["Text"];
return View();
}

3.   模型绑定

我们在View层做如下定义:

  1. @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
  2. {
  3. @Html.TextBox("Name");
  4. @Html.TextBox("Text");
  5. <input type="submit" value="提交" />
  6. }
@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
{
@Html.TextBox("Name");
@Html.TextBox("Text");
<input type="submit" value="提交" />
}

默认的模型绑定

相较于从请求中获取表单值,下面的Edit Action则是简单地以一个模型对像为参数(Album):

  1. [HttpPost]
  2. public ActionResult HelloModelTest( HelloModel model)
  3. {
  4. // ...
  5. }
[HttpPost]
public ActionResult HelloModelTest( HelloModel model)
{
// ...
}

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

  1. public ActionResult HelloModelTest( string name,string text)
  2. // ….
 public ActionResult HelloModelTest( string name,string text)
{
// ….
}

在该场景中,模型绑定将会在请求中查找名为name,text 的参数。

显式模型绑定

当Action有参数的时候,会隐式地执行模型绑定。你还可以在控制器里面使用UpdateModel和 TryUpdateModel来显式调用模型绑定。调用UpdateModel的时候,如果模型对象是无效的或者绑定期间发生错误则会抛出异常。TryUpdateModel则不会抛出异常,它返回一个布尔值:如果绑定成功并且模型验证通过则返回true,否则返回false。

  1. [HttpPost]
  2. public ActionResult HelloModelTest( )
  3. {
  4. HelloModel model = new HelloModel();
  5. if (this.TryUpdateModel(model))
  6. {
  7. //绑定成功
  8. }
  9. else
  10. {
  11. //绑定失败
  12. }
  13. }
[HttpPost]
public ActionResult HelloModelTest( )
{
HelloModel model = new HelloModel(); if (this.TryUpdateModel(model))
{
//绑定成功
}
else
{
//绑定失败
}
}

模型状态是模型绑定产生的副产物。每次绑定器绑定值到模型时,都会在模型状态中进行记录。你可以在模型绑定之后查看模型状态来判断绑定是否成功:

  1. [HttpPost]
  2. public ActionResult HelloModelTest( )
  3. {
  4. HelloModel model = new HelloModel();
  5. this.TryUpdateModel(model);
  6. if (ModelState.IsValid)
  7. {
  8. //绑定成功
  9. }
  10. else
  11. {
  12. <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之间的数据传递总结的更多相关文章

  1. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

  2. Asp.net MVC中 Controller 与 View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...

  3. MVC中Controller与View之间的数据传递

    一.Controller向View传递数据 Controller向View传递数据有3种形式: 通过ViewData传递 在Controller里面的Action方法中定义ViewData,并且赋值, ...

  4. MVC中Controller与View中间的数据传递的常用方法

    这几天正在学习MVC,顺便就将自己每天的学习心得记录下来与大家分享一下吧! 在MVC中,Controller与View之间传递数据是很频繁的事情,所以在这里就总结一下我自己在学习中使用的几种常用的方法 ...

  5. Controller与View之间的数据传递

    1)Controller向View传递数据ViewData["message"] = "Hello";//使用ViewData传递数据ViewBag.Time ...

  6. Asp.Net MVC中Controller与View之间传递的Model

    Controller --> View 的Model 与 提交表单后 View --> Controller 的Model 不是相同的对象,即:这两个Model为不同的指针,指向不同的地址 ...

  7. ASP.NET MVC中controller和view相互传值的方式

    ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...

  8. iOS开发中视图控制器ViewControllers之间的数据传递

    iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...

  9. ASP.NET MVC 之控制器与视图之间的数据传递

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...

随机推荐

  1. phpcurl类

    1.需求 了解curl的基本get和post用法 2.例子 <?php class Curl{ private $timeout=30; public function set_timeout( ...

  2. 耿丹CS16-2班第六次作业汇总

    Deadline: 2016-11-13 11:59 作业内容 第六次作业总结 00.本次题目分值最高为**6分/题 × 7题 + 5分/篇 × 1篇 = 47分**,其中有新解法者每题加原创分**2 ...

  3. WebForm控件--2016年12月29日

    简单控件 1.Label  =>   <span id="Label1">Label1</span> 2.Literal  =>  Text 填 ...

  4. ms08-067漏洞--初识渗透测试--想必很多初学者都会遇到我文中提及的各种问题

    最近读了一本书--<<渗透测试实践指南>>,测试了书中的一些例子后,开始拿ms08-067这个经典的严重漏洞练手,实践当中遇到诸多问题,好在一一解决了,获益匪浅. 在谷歌搜索的 ...

  5. Linux下的压缩和解压缩命令——tar

    tar命令 选项: -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只 ...

  6. Glassfish在SpringMVC服务端接收请求时字符出现乱码的解决办法

    环境描述 前端:jsp 后端:SpringMVC Controller 尽管jsp页面已设置了pageEncoding: <%@page contentType="text/html& ...

  7. 基于netty轻量的高性能分布式RPC服务框架forest<下篇>

    基于netty轻量的高性能分布式RPC服务框架forest<上篇> 文章已经简单介绍了forest的快速入门,本文旨在介绍forest用户指南. 基本介绍 Forest是一套基于java开 ...

  8. yii框架安装

    YII安装:      下载最版本http://www.framework.com 下载高级的->yii with advanced APPlication template 解压至访问目录下 ...

  9. MySql卸载重新安装出现Start service没有响应的解决办法(64位)

    昨天因为自己手欠,不小心把mysql卸载了,于是又得重新安装,但是每次到了最后一步就报没有响应,于是就去寻找解决办法,如下就是啦! 安装Mysql卸载后又重新安装,每次到最后Start service ...

  10. APM程序分析-ArduCopter.cpp

    该文件是APM的主文件. #define SCHED_TASK(func, rate_hz, max_time_micros) SCHED_TASK_CLASS(Copter, &copter ...