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

  ASP.NET MVC中Controller向view传值的方式

  1. ViewBag、ViewData、TempData
  2. 单个值的传递
  3. Json
  4. 匿名类型
  5. ExpandoObject
  6. Cookie
  7. ViewModel(向普通View页面传个Model对象、向强类型页面传一个Model对象、用一个ViewModel对象解决所有问题)

  ASP.NET MVC中view向Controller传值的方式

  1. QueryString
  2. RouteData
  3. Model Binding(form、使用和Action参数同名的变量进行传递)
  4. Cookie

  在MVC中ViewBag的作用是数据的传递。在MVC3开始,视图数据能够通过ViewBag属性访问。在MVC2中则是使用ViewData。MVC3中保留了ViewData的使用。ViewBag是动态类型的(dynamic),ViewData是一个字典型的(Dictionary)。

MVC3中ViewBag和ViewData的差别:

ViewBag不再是字典的键值对结构,而是dynamic动态类型的。 它会在程序执行的时候动态解析。

所以在视图中获取它的数据时候不须要进行类型转换

ViewDataViewBag
它是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中查询数据时不须要类型转换
有一些类型转换代码可读性更好

View向Controller中传递数据的方式

QueryString

View中代码:

复制代码
<div><button id="btn">提交</button>
</div>
<script>$(function () {$('#btn').click(function () {//url不区分大小写location.href = "/home/getvalue?method=querystring";});});
</script>
复制代码

Controller中代码:

public void GetValue()
{//Request属性可用来获取querystring,form表单以及cookie中的值var querystring = Request["method"];
}

使用querystring向后台传递属于http协议中的get方式,即数据会暴露在url中,安全性不高(可通过浏览器历史记录看到发送的数据)且传递的数据量有大小限制。
点击提交按钮后浏览器地址栏中的地址:http://localhost:57625/home/getvalue?method=querystring。程序执行结果如下:

RouteData

路由可以让我们写出可读性较高的url,使用路由传递数据,首先要配置合适的路由:

routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}"
);

前端代码只需要将location.href的值改为和路由匹配的url即可,本示例中为"/home/getvalue/100"
Controller中的代码:

public void GetValue()
{var value = RouteData.Values["id"];
}

获取的值是object类型:


获取路由参数的另外一种方式是给Action设置一个和路由模板中指定的参数名一致(不区分大小写)的参数即可,代码如下:

public void GetValue(int id)
{}

注意,这里不仅获取了路由数据,而且自动将数据类型转换为int类型:

querystring和路由均是通过url进行数据的传递,若数据中包含中文应进行Encode操作。此外,url的长度是有限制的,使用url不可传递过多的数据。url传递参数属于Http协议中的Get请求,若要发送大量数据可以使用Post请求。

ModelBinding

1. Form

form表单形式是常见的向后端发送数据的方式,但是在提交数据是只会提交form表单内部具有name属性input,textarea,select标签的value值。
View中的代码:

<form action="/home/getvalue" method="post"><input type="text" name="username" /><input type="text" name="age" /><input type="submit" name="button" value="提交" />
</form>

Controller中的代码:

复制代码
public void GetValue()
{var name = Request["username"];var age = Request["age"];var btn = Request["button"];
}
复制代码

获取到的数据均为string类型:

现在我们创建一个和form表单对应的类:

public class User
{public string UserName { set; get; }public int Age { set; get; }
}

修改Action的代码如下:

public void GetValue(User user)
{}

然后运行程序,可以看到MVC以将表单中的数据映射为User类实例的属性值,且进行了相应的数据类型的转换。

2. 使用和Action参数同名的变量进行传递

View中的代码:

复制代码
<button id="btn">传递数据</button>
<script>$(function () {$('#btn').click(function () {$.ajax({'type': 'post', 'url': '/home/getdata',//传递的数据也可以是序列化之后的json格式数据//如,上面使用form表单提交数据就可以使用jquery中的serialize()方法将表单进行序列化之后在提交//data:$('#form').serialize()'data': { username: '雪飞鸿', age: '24' },error: function (message) {alert('error!');}});})})
</script>
复制代码

 

Controller中的代码:

public void GetData(string username, int age)
{}

在Action中成功获取到了对应的参数值,且数据类型也根据Action中参数的类型进行了相应的转换。

Model绑定体现在从当前请求提取相应的数据绑定到目标Action方法的同名参数中。对于这样的一个Action,如果是Post请求,MVC会尝试将Form(注意,这里的Form不是指html中的<form>表单,而是Post方法发送数据的方式,若我们使用开发者工具查看Post方式发送的请求信息,会看到Form Data一栏)中的值赋值到Action参数中,如果是get请求,MVC会尝试将QueryString的值赋值到Action参数中。

Cookie

这里引用jquery.cookie插件来进行cookie的操作

复制代码
<body><button id="btn">提交</button><script>$(function () {//向cookie中写入值$.cookie('key', 'jscookie');$('#btn').click(function () {location.href = "/home/getvalue";});})</script>
</body>
复制代码
public void GetValue()
{var cookie = Request["key"];
}

 

Controller向View中传值

单个值的传递

复制代码
public ActionResult Index()
{//注意,传递的值不能是string类型,否则会执行View(string viewName)方法而导致得不到正确结果return View(100);
}
复制代码
<body><p>@Model</p>
</body>
程序执行结果如下:

Json

复制代码
public ActionResult Index()
{return View();
}public JsonResult SendData()
{return Json(new { UserName = "雪飞鸿", Age = 24 });
}
复制代码
复制代码
<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" /><script src="~/scripts/jquery-1.10.2.min.js"></script>
</head>
<body><p id="message"></p><button id="btn">获取数据</button><script>$(function () {$('#btn').click(function () {$.ajax({'url': '/home/senddata', 'type': 'post',success: function (data) {$('#message').html('用户名:' + data.UserName + "<br/>年龄:" + data.Age);},error: function (message) {alert('error:' + message.statusText);}});});});</script>
</body>
</html>
复制代码
程序执行结果如下:

匿名类型

public ActionResult Index()
{//使用匿名类向View中传递数据return View(new { UserName = "雪飞鸿", Age = 24 });
}
复制代码
<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" />
</head>
<body><p>用户名:@Model.UserName</p><p>年龄:@Model.Age</p>
</body>
</html>
复制代码

因为匿名类型的类型名由编译器生成,并且不能在源代码级使用。所以,直接使用匿名类型向View中传递数据,在前台页面是无法访问到匿名类型中的属性的。执行上面代码程序会出现错误:

针对上述问题,使用Newtonsoft将匿名类型转换为json格式即可解决该问题。
使用NuGet引入Newtonsoft.Json包,然后修改代码如下:

复制代码
public ActionResult Index()
{string json = JsonConvert.SerializeObject(new { UserName = "雪飞鸿", Age = 24 });//也可以直接序列化JSON格式的字符串//dynamic jsonObj = JsonConvert.DeserializeObject("{ UserName : \"雪飞鸿\", Age : 24 }");dynamic jsonObj = JsonConvert.DeserializeObject(json);return View(jsonObj);
}
复制代码
程序执行结果如下:

ExpandoObject

上面提到,直接使用匿名类型向View中传递数据是行不通的,可以使用ExpandoObject类型对象来替代匿名类型

复制代码
public ActionResult Index()
{dynamic user = new ExpandoObject();user.UserName = "雪飞鸿";user.Age = 24;return View(user);
}
复制代码
程序执行结果如下:

ViewBag、ViewData、TempData

复制代码
public ActionResult Index()
{ViewBag.Title = "数据传递";ViewData["key"] = "传递数据";//默认情况下TempData中的数据只能使用一次TempData["temp"] = "tempdata";return View();
}
复制代码
复制代码
<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" /><title>@ViewBag.Title</title>
</head>
<body><p>@ViewData["key"]</p><p>@TempData["temp"]</p>
</body>
</html>
复制代码
程序执行结果如下:

ViewModel

通过视图模型将数据传递到前端

复制代码
//视图模型
public class User
{public string UserName { set; get; }public int Age { set; get; }
}
//Action
public ActionResult Index()
{User user = new User() { UserName = "雪飞鸿", Age = 24 };return View(user);
}
复制代码
复制代码
@* 设置页面为强类型页面 *@
@model DataTransfer.Controllers.User
@{Layout = null;
}<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" /></head>
<body><p>用户名:@Model.UserName</p><p>年龄:@Model.Age</p>
</body>
</html>
复制代码
程序执行结果如下:

Cookie

public ActionResult Index()
{Response.SetCookie(new HttpCookie("key", "cookie"));return View();
}
复制代码
<body><p id="message"></p><script>$(function () {var message = $.cookie('key');$('#message').text(message);})</script>
</body>
复制代码
程序执行结果如下:

转载于:https://www.cnblogs.com/baojiao/p/8882566.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自定义SeekBar 实时显示百分比进度

进度下方实时显示百分比进度禁止掉了SeekBar的滑动事件 详情 githus地址

数据结构与算法--3.字符串的旋转

题目&#xff1a; A是含有n个元素的数组&#xff0c;如果可以申请到最大内存&#xff0c;那么把A从位置i开始旋转是比较简单的。例如&#xff1a;A:a,b,c,d,e.其中i3,旋转后的字符串A为&#xff1a;d,e,a,b,c要求设计一个时间复杂度为O(n),空间复杂度为O(1)的算法&#xff0c;…

三网融合情况下,实时语音通信技术解决之道

随着技术和标准的不断成熟,伴随着“三网合一”的大潮,VoIP可望成为下一代电信基础设施结构的杨心,使未来各电信业务综合统一在IP网络上成为可能,导致数据的融合和未来电信市场的重组,并带来新的经济模式和价值链。 Internet在全世界范围内的快速发展和语音信号处理技术的进步,促…

ipv6相对于ipv4的改进

v更大的地址空间&#xff1a;16字节&#xff0c;128位v首部的简化&#xff1a;只有7个固定域&#xff0c;撤消了有关分段的域和校验和域&#xff0c;以便更快地处理分组&#xff0c;提高路由器的吞吐量缩短延时。v更好地支持选项&#xff1a;选项是有次序的&#xff0c;以便路由…

轻量高效的开源JavaScript插件和库 【转】

图片布局轮播图弹出层音频视频编辑器字符串表单存储动画时间其它加载器构建工具测试包管理器CDN图片 baguetteBox.js - 是一个简单易用的响应式图像灯箱效果脚本。demoLightgallery.js - 是一个功能齐全的JavaScript图像灯箱插件。demoviewerjs - 是一个图像预览插件。democrop…

Linux内核中的常用宏container_of其实很简单【转】

转自&#xff1a;http://blog.csdn.net/npy_lp/article/details/7010752 开发平台&#xff1a;Ubuntu11.04 编 译器&#xff1a;gcc version 4.5.2 (Ubuntu/Linaro4.5.2-8ubuntu4) Container_of在Linux内核中是一个常用的宏&#xff0c;用于从包含在某个结构中的指针获得结构本…

mysql concat例子_MYSQL中CONCAT详解

concat()函数1. 功能&#xff1a;返回结果为连接参数产生的字符串。如有任何一个参数为NULL &#xff0c;则返回值为 NULL。2. 语法concat(str1, str2,...)3. 例子案例一&#xff1a;mysql> select concat(苹果,香蕉,梨子);------------------------------| CONCAT(苹果,香蕉…

常见的状态响应码

200&#xff1a;请求正常&#xff0c;服务器正常的返回数据 301&#xff1a;永久重定向。比如在访问www.jingdong.com的时候&#xff0c;会重定向到www.jd.com。 302&#xff1a;临时重定向。比如在访问一个需要登录的界面时&#xff0c;而此时没有登录&#xff0c;那么就会重定…

软件行业为什么那么多项目经理

记得听谁说过&#xff0c;软件行业的项目经理太滥了&#xff0c;二十几岁的毛头小伙子&#xff0c;动不动就是项目经理&#xff0c;手下没几个人&#xff0c;管的也没几个事&#xff0c;在其他行业&#xff0c;项目经理一般都是四五十岁的老头子做&#xff0c;要联系这&#xf…

ipv6的表示方法

v冒分十六进制表示法X:X:X:X:X:X:X:X 其中X表示地址中16位二进制数的十六进制值 例&#xff1a;FEDC:BA98:7654:3210:FEDC:BA98:7654:3210 v零压缩法如其中有多个连续的零&#xff0c;则可用零压缩法 如 &#xff1a;1080:0000:0000:0000:0008:0800:200C:417A 可写成&am…

mysql php7安装配置_centos7无网络下安装部署php7.1.33+mysql5.7.28+apache2.4.6-Go语言中文社区...

centos7无网络下安装部署php7.1.33mysql5.7.28apache2.4.6一、1、先ping www.baidu.com&#xff0c;root账户下&#xff0c;如果未联网&#xff0c;创建目录&#xff0c;把提前下载好的rpm包拷贝到rpm目录下如图&#xff1a;(如果没有安装包请查看我的另一篇教程下载这些安装包…

webkit渲染

2019独角兽企业重金招聘Python工程师标准>>> 参考链接 理解WebKit和Chromium 简明魔法学院 Chrome软件渲染 WebKit渲染基础 Webkit 渲染基础 Webkit不是浏览器,它是一个渲染引擎 软件渲染 硬件渲染(GPU加速) 会触发GPU加速的属性 CSS3 3D transformation, trans…

element ui中dialog相关问题

一&#xff0c;今天需要在dialog里面引入另一个页面&#xff0c;就是打开dialog显示该页面&#xff08;把页面放到dialog中&#xff09;&#xff0c;引入的语句如下&#xff1a; <iframe src"view?pathrkdj_b" ></iframe> 二&#xff0c;使用table组件时…

数据结构与算法--4.使用堆栈模拟队列

问题&#xff1a; 队列的插入和删除遵循先入先出的原则&#xff0c;而堆栈遵循后进先出的原则。用两个堆栈模拟队列&#xff0c;要求实现时不能分配超过O&#xff08;1&#xff09;的内存&#xff0c;时间复杂度必须是o&#xff08;m&#xff09;。 思路&#xff1a; 用两个…

IT行业的你,在成本部门还是利润部门

题外话&#xff1a;本文应该引起项目管理者和开发人员的思考&#xff1a;如何进行薪酬管理&#xff1f;如何规划职业生涯&#xff1f; 生在IT行业&#xff0c;发现周围很多朋友对薪酬问题有疑问&#xff0c;因为这种不解&#xff0c;导致经常带情绪&#xff0c;对工作、生活很…

ipv4到ipv6的过渡

v双协议站&#xff1a;过渡时期&#xff0c;站点必须同时支持IPv4和IPv6v隧道技术&#xff1a;IPv6主机之间通信必须使用IPv4的隧道v首部转换&#xff1a;用于发送方使用IPv6&#xff0c;而接收方使用IPv4

关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup...

http://www.cnblogs.com/binye-typing/p/6656595.html 读者可能会奇怪我标题怎么理成这个鬼样子&#xff0c;主要是单单写 lxml 与 bs4 这两个 py 模块名可能并不能一下引起大众的注意&#xff0c;一般讲到网页解析技术&#xff0c;提到的关键词更多的是 BeautifulSoup 和 xpat…

java如何去掉html标签_Java后端去掉HTML标签获取纯文本-Fun言

今天又对我的博客首页进行了一次版本的更新&#xff0c;使其自适应屏幕&#xff0c;获得更好的用户体验&#xff0c;然后就出现点小问题&#xff0c;那就是原来的摘要是人为添加的&#xff0c;有长有短&#xff0c;对自适应屏幕有影响&#xff0c;所以我们现在是截取文章的前20…

单/双中括号与测试条件

测试命令 tesst[]内置命令[[]]bash中的关键字 单中括号 格式[#express1#op#express2#] 注意&#xff1a;   其中#代表括号不能省略   不能匹配模式   变量引用应用双引号括起&#xff0c;尤其当变量引用有空格时   与或非形式-a –o -not   常量应用单/双引号括起  …

暗时间--平凡与优秀间的距离

每个人都希望&#xff0c;在他所从事的领域很优秀&#xff0c;那么如何才能优秀呢&#xff1f;有人做过一个研究&#xff0c;说那些优秀的音乐家&#xff0c;在他们成名之前&#xff0c;已经训练过10000小时。有人可能成功得早&#xff0c;如莫扎特16岁&#xff0c;有些可能需要…