MVC中Controller与View之间的数据传递
一、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中定义如下:
ViewBag.Message_ViewBag = “ Hello ViewBag !”;
然后在View中读取Controller中定义的ViewBag数据,代码如下:
@Html.Encode(ViewBag.Message_ViewBag)
js中读取ViewBag中数据如下:
<script type="text/javascript"> var viewBag= '@ViewBag.Message_ViewBag'; </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实体类:
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如下图所示:
创建强类型的View以后,View的第一行代码如下所示:
@model Test.Models.HelloModel
然后在View中读取Model中定义的数据,代码如下:
@Html.Encode(Model.Name)
二、View向Controller传递数据
在ASP.NET MVC中,将View中的数据传递到Controller中,主要通过发送表单的方式来实现。具体的方式有:
- 通过Request.Form读取表单数据
我们在View层做如下定义:
@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"];//根据View中控件的name来获取value值
string text= Request.Form["Text"];
return View();
}
- 通过FormCollection读取表单数据
我们在View层做如下定义:
@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();
}
- 自定义数据绑定
虽然我们可以通过Request.Form或FormCollection方式读取表单数据,可是通常这两种方式都比较繁琐。
在强类型View的情况下,我们通常会使用Controller 基类的内置方法UpdateModel()。
public ActionResult Edit(int id, FormCollection collection)
{
//Users user = userRepository.GetUser(id);
//user.UserName = Request.Form["UserName"];
//user.Password = Request.Form["Password"];
//user.Telephone = Request.Form["Telephone"];
//user.Address = Request.Form["Address"];
//上述方法有一点繁琐,特别是增加异常处理逻辑之后。一个更好的方法是使用Controller 基类的内置方法UpdateModel()。
该方法支持使用传入的表单参数更新对象的属性,它使用反射机制来解析对象的属性名称,接着基于客户端传入的参数值自动赋值给对象相关属性。
Users user = userRepository.GetUser(id);
string[] allowedProperties = new[] { "UserName", "Password", "Telephone", "Address" };
UpdateModel(user, allowedProperties);
userRepository.Save();
return RedirectToAction("Details", new { id = user.ID });
}
- Request.QueryString读取数据
Request.QueryString - GET传递 , get值在url中。
Request.Form - POST传递 , post值在HTTP消息正文中。
我们在View层做如下定义:
@Html.ActionLink("Edit", "Edit", new { word = "word1" })
然后在Controller层
public ActionResult Edit (string word)
{
ViewData["word"] = Request.QueryString["word"];
return View();
}
Request.QueryString 是一个name/value 的集合,需要使用["name"]去查找相应的值。
Request.QueryString["name"]就是指 url中名称为name的参数。比如 a.aspx?name=111,Request.QueryString["name"] 的值 就是"111"。
C#中的[]写法是很先进的一种思想,就是基于索引机制。是一个C#索引器语法,采用字符串作为索引,类似数组索引。
我们在View层做如下定义:
<input type="text" name="keyword" value="@Request.QueryString["keyword"]" class="form-control" />
然后在Controller层
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之间的数据传递的更多相关文章
- Asp.net MVC中 Controller 与 View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...
- ASP.NET MVC3中Controller与View之间的数据传递总结
一. Controller向View传递数据 1. 使用ViewData传递数据 我们在Controller中定义如下: ViewData["Message_ViewData& ...
- ASP.NET MVC3中Controller与View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一. Controller向Vie ...
- 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 之控制器与视图之间的数据传递
今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...
随机推荐
- EGit系列第二篇——关联远程仓库
网上也有很多代码托管网站支持git,像最出名的GitHub,还有国内支持私有项目的OSC开源中国和CSDN等... 首先得注册个帐号,然后才可以创建仓库 一般都会带一个ReadMe.md,你可以勾选也 ...
- django进阶-modelform&admin action
先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...
- kafka---->kafka的使用(一)
今天我们来学习一下kafka的简单的使用与配置.世上有可以挽回的和不可挽回的事,而时间经过就是一种不可挽回的事. kafka的安装配置 一.kafka的使用场景 活动跟踪:网站用户与前端应用程序发生交 ...
- python tkinter Listbox用法
python tkinter组件的Listbox的用法,见下面代码的演示: from tkinter import * root=Tk() v=StringVar() #Listbox与变量绑定' l ...
- jquery validator
jQuery.validate是一款非常不错的表单验证工具,简单易上手,而且能达到很好的体验效果,虽然说在项目中早已用过,但看到这篇文章写得还是不错的,转载下与大家共同分享. 一.用前必备 官方网站: ...
- Elasticsearch修改template的mapping并迁移
找到原始模板并修改 找到要修改的原始索引对应的模板(最好当初创建时就设计好便于修改) #例如原来索引是my_es_index_v1,那么我们创建 一个别名,使用POST 方法 curl -XPOST ...
- Artech的MVC4框架学习——第四章Model元数据的解析
总结: 第一Model元数据是针对 数据类型的一种表述信息. 第二Model元数据作用:控制数据类型本身及其成员,通过相应的特性,在view中 为绑定的数据(Model)实现模版化的html呈现. 第 ...
- [SharePoint 2010] SharePoint 2010 FBA 配置以及自定义首页
https://blogs.msdn.microsoft.com/kaevans/2010/07/09/sql-server-provider-for-claims-based-authenticat ...
- 遮挡剔除 Occlusion Culling(转)
一.首先介绍下draw call(这个东西越少你的游戏跑的越快): 在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏 ...
- phantomjs试玩
简单来说,phantomjs就是一个运行在node上的webkit内核,支持DOM渲染,css选择器,Canvas,SVG等,在浏览器上能做的事情,理论上,phantomjs 都能模拟做到. phan ...