一、  Controller向View传递数据

1.       使用ViewData传递数据

我们在Controller中定义如下:

[csharp] view plaincopy print?
  1. ViewData[“Message_ViewData”] = “ Hello ViewData!”;

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

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

[html] view plaincopy print?
  1. @Html.Encode(ViewData["Message_ViewData"])

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

js中读取ViewData中数据如下:

[javascript] view plaincopy print?
  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中定义如下:

[csharp] view plaincopy print?
  1. ViewBag.Message_ViewBag =  “ Hello ViewBag !”;

ViewBag.Message_ViewBag =  “ Hello ViewBag !”;

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

[html] view plaincopy print?
  1. @Html.Encode(ViewBag.Message_ViewBag)

@Html.Encode(ViewBag.Message_ViewBag)

js中读取ViewBag中数据如下:

[javascript] view plaincopy print?
  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中定义如下:

[csharp] view plaincopy print?
  1. TempData[“Message”] = “Hello word!”;

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

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

[html] view plaincopy print?
  1. @Html.Encode(TempData["Message_TempData"])

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

js中读取TempData中数据如下:

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

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

4.   使用Model传递数据

首先要创建Model实体类:

[csharp] view plaincopy print?
  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的第一行代码如下所示:

[html] view plaincopy print?
  1. @model Test.Models.HelloModel

@model Test.Models.HelloModel

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

[html] view plaincopy print?
  1. @Html.Encode(Model.Name)

@Html.Encode(Model.Name)

js中读取Model中数据如下:

[javascript] view plaincopy print?
  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层做如下定义:

[html] view plaincopy print?
  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读取表单数据的代码如下所示:

[csharp] view plaincopy print?
  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层做如下定义:

[html] view plaincopy print?
  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读取表单数据的代码如下所示:

[csharp] view plaincopy print?
  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层做如下定义:

[html] view plaincopy print?
  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):

[csharp] view plaincopy print?
  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),你完全可以传入一个原始的简单参数:

[csharp] view plaincopy print?
  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。

[csharp] view plaincopy print?
  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{//绑定失败}
}

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

[csharp] view plaincopy print?
  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>//绑定失败

}}

如果在模型绑定过程中发生异常,模型状态里面就会包含导致异常的那个属性名,绑定值以及错误信息。

转载于:https://www.cnblogs.com/jf-guo/p/6189245.html

ASP.NET MVC3中Controller与View之间的数据传递总结相关推荐

  1. 【转载】ASP.NET MVC中Controller与View之间的数据传递总结

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

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

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

  3. [转载]Asp.net MVC中Controller返回值类型

    Asp.net MVC中Controller返回值类型 在mvc中所有的controller类都必须使用"Controller"后缀来命名 并且对Action也有一定的要求: 必须 ...

  4. 一起谈.NET技术,在ASP.NET MVC3 中利用JSONP跨域登录WEB系统

    在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复登陆.每次登录都需要输入用户名和密码.最近比较流行的就 ...

  5. IOS delegate 委托 使用 两个View之间传数据

    今天讲述 delegate 的使用,并给出例子来说明如何使用delegate在两个View之间传送数据 1.建立一个 single view 工程 2.在viecontroller.xib文件里面放上 ...

  6. Android中Activity之间的数据传递(Intent和Bundle)

    当一个Activity启动另一个Activity时,常常会有一些数据传过去,对于Activity之间的数据交换更简单,因为两个Activity之间进行数据传递交换更简单,因为两个Activity之间本 ...

  7. 三个activity之间跳转 数据传递_第二百四十二回:Android中Fragment之间的数据传递概述...

    各位看官们大家好,上一回中咱们说的是Android中Activity之间数据传递的例子,这一回咱们说的例子是Fragment之间的数据传递.闲话休提,言归正转.让我们一起Talk Android吧! ...

  8. VEU中的组件之间的数据传递

    组价三部曲 创建组件. 注册组件. 使用组件. 组件之间的数据传递的方式 1. 父传子 :通过props属性传递 2. 子传父 通过$emit属性,用来发布自定义事件 3. 兄弟组件之间的传递 1.父 ...

  9. servlet向ajax传递数据库,一、JSP、servlet、SQL三者之间的数据传递(前台与后台数据交互)...

    背景: 目前业界很流行的MVC(model-view-control)开发模式,理解为 模型是Bean, 视图是 Html/Jsp, 控制是Servlet, 关联数据库的Dao web的运行机制: 数 ...

最新文章

  1. HarmonyOS ToastDialog 的使用
  2. 现在的教育:感慨之一
  3. 【深度学习】Squeeze-and-Excitation (SE) 模块优势解读
  4. TWebBrowser的基本应用
  5. pandas 根据单号分类_由 “猫捉老鼠”游戏联想的用户分类问题
  6. AntDesignUI - V3.0 技术手册(资源篇)
  7. 基础编程题目集 6-6 求单链表结点的阶乘和 (15 分)
  8. 明略数据获 10 亿人民币 C 轮融资,华兴新经济基金、腾讯领投
  9. 数据仓库技术解决方案
  10. 华为NP课程笔记15-Eth-Trunk与高级VLAN
  11. 人人开源-renren-generator的基本使用
  12. 程序员客栈v4.21:多一个作品便多一份工作机会
  13. 最新!中国内地高校ESI排名出炉:342所大学上榜!
  14. VS2017下载地址
  15. nodejs后端office转pdf
  16. java.lang.NoClassDefFoundError异常原因分析和解决方案
  17. php 设置允许跨域请求
  18. java摄影网站源码_基于jsp的摄影网站-JavaEE实现摄影网站 - java项目源码
  19. 幼儿体能五项技能测试软件,体能测查 | 幼儿园体能测试项目及标准,建议新手幼师收藏!...
  20. 操作系统真实的虚拟内存是什么样的(一)

热门文章

  1. 依赖ConstraintLayout报错,Could not find *****,Failed to resolve:*****
  2. C中strcpy函数实现
  3. leetcode算法题--对称的二叉树
  4. linux内核网络协议栈--ip层报文转发之ip_local_out()函数(六)
  5. 运用RUP 4+1视图方法进行软件架构设计
  6. python使用阿里云sdk
  7. 扬帆起航 继续前行1 nginx+lua+template+cache
  8. python 数据结构
  9. 聊聊webflux参数校验
  10. 基于虚拟账号的邮件系统