一、Controller向View传递数据

Controller向View传递数据有3种形式:

  • 通过ViewData传递

在Controller里面的Action方法中定义ViewData,并且赋值,比如 ViewData["message"] = "Hello Word!";

然后在View里面读取Controller中定义的ViewData数据

比如联系人: <input type="text" value='<%=ViewData["message"] %>' name="message"/>

ViewData的生命周期和View相同,只对当前View视图有效。

  • 通过TempData传递

与ViewData的使用和传递方式相类似。TempData实际上保存在Session中,控制器每次执行请求时都会从Session中获取TempData数据并删除该Session。TempData数据只能在控制器中传递一次,其中的每个元素也只能被访问一次,访问之后会被自动删除。

现在在Controller里面定义TempData,并且赋值,比如 TempData["message"] = “你好!”;

然后在View里面读取Controller中定义的TempData数据

比如联系人: <input type="text" value='<%=TempData["message"] %>' name="message"/>

  • 通过ViewBag传递

我们在Controller中定义如下:

  1. ViewBag.Message_ViewBag = Hello ViewBag !”;

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

  1. @Html.Encode(ViewBag.Message_ViewBag)

js中读取ViewBag中数据如下:

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

ViewData

ViewBag

它是Key/Value字典集合

它是dynamic类型对像

从Asp.net MVC 1 就有了

ASP.NET MVC3 才有

基于Asp.net 3.5 framework

基于Asp.net 4.0与.net framework

ViewData比ViewBag快

ViewBag比ViewData慢

在ViewPage中查询数据时需要转换合适的类型

在ViewPage中查询数据时不需要类型转换

有一些类型转换代码

可读性更好

关于ViewData,TempData和ViewBag的更多区别,参见http://www.cnblogs.com/bianlan/archive/2013/01/11/2857105.html

  • 通过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. }

使用Model传递数据的时候,通常在创建View的时候我们会选择创建强类型View如下图所示:

创建强类型的View以后,View的第一行代码如下所示:

  1. @model Test.Models.HelloModel

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

  1. @Html.Encode(Model.Name)

二、View向Controller传递数据

在ASP.NET MVC中,将View中的数据传递到Controller中,主要通过发送表单的方式来实现。具体的方式有:

  • 通过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. }

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

  1. [HttpPost]
  2. public ActionResult HelloModelTest()
  3. {
  4. string name= Request.Form["Name"];//根据View中控件的name来获取value值
  5. string text= Request.Form["Text"];
  6. return View();
  7. }
  • 通过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. }

然后在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. }
  • 自定义数据绑定

虽然我们可以通过Request.Form或FormCollection方式读取表单数据,可是通常这两种方式都比较繁琐。

在强类型View的情况下,我们通常会使用Controller 基类的内置方法UpdateModel()。

  1. public ActionResult Edit(int id, FormCollection collection)
  2. {
  3. //Users user = userRepository.GetUser(id);
  4. //user.UserName = Request.Form["UserName"];
  5. //user.Password = Request.Form["Password"];
  6. //user.Telephone = Request.Form["Telephone"];
  7. //user.Address = Request.Form["Address"];
  8. //上述方法有一点繁琐,特别是增加异常处理逻辑之后。一个更好的方法是使用Controller 基类的内置方法UpdateModel()。
            该方法支持使用传入的表单参数更新对象的属性,它使用反射机制来解析对象的属性名称,接着基于客户端传入的参数值自动赋值给对象相关属性。
  9. Users user = userRepository.GetUser(id);
  10. string[] allowedProperties = new[] { "UserName", "Password", "Telephone", "Address" };
  11. UpdateModel(user, allowedProperties);
  12. userRepository.Save();
  13. return RedirectToAction("Details", new { id = user.ID });
  14. }
  • Request.QueryString读取数据

Request.QueryString - GET传递 , get值在url中。

Request.Form - POST传递 , post值在HTTP消息正文中。

我们在View层做如下定义:

  1. @Html.ActionLink("Edit", "Edit", new { word = "word1" })

然后在Controller层

  1. public ActionResult Edit (string word)
  2. {
  3. ViewData["word"] = Request.QueryString["word"];
  4. return View();
  5. }

Request.QueryString 是一个name/value 的集合,需要使用["name"]去查找相应的值。
Request.QueryString["name"]就是指 url中名称为name的参数。比如 a.aspx?name=111,Request.QueryString["name"] 的值 就是"111"。

C#中的[]写法是很先进的一种思想,就是基于索引机制。是一个C#索引器语法,采用字符串作为索引,类似数组索引。

我们在View层做如下定义:

  1. <input type="text" name="keyword" value="@Request.QueryString["keyword"]" class="form-control" />

然后在Controller层

  1. public ActionResult Search(int id = , string keyword = null) { }

三、request.querystring和request.form的区别

  • request.querystring和request.form的区别

request.querystring是用来接收地址里面问号“?”后面的参数的内容,用get方法读取的不安全。
request.form是用来接收表单递交来的数据,是用post方法读取的form表单中的method中看你是get还是post ,一般form中都用post。

  • get和post的区别

get方法把参数及参数值暴露给访客,所以是不安全的。而且url传送的参数长度有限,但便捷。
post方法传送的参数长度可以很大,而且参数及参数值不被访客所看到。{ return Request.QueryString["reportDate"]; }

 

四、request对象五个集合

  • QueryString:用以获取客户端附在url地址后的查询字符串中的信息。

例如:stra=Request.QueryString ["strUserld"]

  • Form:用以获取客户端在FORM表单中所输入的信息。

例如:stra=Request.Form["strUserld"]

  • Cookies:用以获取客户端的Cookie信息。

例如:stra=Request.Cookies["strUserld"]

  • ServerVariables:用以获取客户端发出的HTTP请求信息中的头信息及服务器端环境变量信息。

例如:stra=Request.ServerVariables["REMOTE_ADDR"],返回客户端IP地址

  • ClientCertificate:用以获取客户端的身份验证信息

例如:stra=Request.ClientCertificate["VALIDFORM"],对于要求安全验证的网站,返回有效起始日期。

MVC中Controller与View之间的数据传递的更多相关文章

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

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

  2. ASP.NET MVC3中Controller与View之间的数据传递总结

    一.  Controller向View传递数据 1.       使用ViewData传递数据 我们在Controller中定义如下: ViewData["Message_ViewData& ...

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

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

  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. 【Phalapi】新加Namespace (模块)

    官网地址: https://www.phalapi.net/ github 地址: https://github.com/phalapi/phalapi/tree/master-2x 1 compos ...

  2. Python tkinter 控件更新信息

    下面几个例子关于tkinter界面更新的,简单易懂,分享一下. 例子_1: 代码_1: from tkinter import Tk, Checkbutton, Label from tkinter ...

  3. VIM 的一些技巧

    vim配置文件 ~/.vimrc 如果没有自己创建一个即可 filetype plugin indent on #打开插件 set number #显示行号 syntax on #语法高亮 set c ...

  4. C# 递归与非递归算法与数学公式

    1.递归 递归:程序调用自身的编程技巧称为递归(recursion). 优点是:代码简洁,易于理解. 缺点是:运行效率较低. 递归思想:把问题分解成规模更小,但和原问题有着相同解法的问题. 1)下面是 ...

  5. 使用curl进行s3服务操作

    最近使用curl对s3进行接口测试,本想写个总结文档,但没想到已有前辈写了,就直接搬过来做个记录吧,原文见: http://blog.csdn.net/ganggexiongqi/article/de ...

  6. jmeter函数助手之time函数实操

    在一个接口测试中,需要提交的请求中要带时间,在看完jmeter帮忙文档,正好总结一下 1.需求 在一个XML请求中请求数据要带有时间,如下 "><ID>/lte/pdeta ...

  7. github中删除一个repository

    (1) 首先进入相应的repository,然后点击setting 2,点击 delete the repository (3) 输入要删除的repository名字,即可删除

  8. 原生JS实现全选,反选

    无样式,比较丑 <!DOCTYPE html><html><head><meta charset="UTF-8"><title ...

  9. MyEclipse无法创建servers视图:Could not create the view: An unexpected exception was thrown

    今天上班刚打开MyEclipse,就发现servers视图无法打开了,显示:Could not create the view: An unexpected exception was thrown. ...

  10. POJ-1958 Strange Towers of Hanoi(线性动规)

    Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 2677 Accepted: 17 ...