ASP.NET MVC 学习笔记-5.Controller与View的数据传递
ViewData属性
ViewData属性是System.Web.Mvc.ControllerBase中的一个属性,它相当于一个数据字典。Controller中向该字典写入数据,ViewData[“Key”]=data;View中从该字典中获取数据 int data=ViewData[“Key”]。从ViewData中获取到的数据是object类型,必须强制类型转换。
//
// 摘要: Gets or sets the dictionary for view data.
// 返回结果: The dictionary for the view data.
public ViewDataDictionary ViewData { get; set; }
ViewBag属性
C# 4.0中才提出的ViewBag,在ViewData上引入了动态特性,算是ViewData的语法糖。
ViewData |
ViewBag |
Key/Value字典集合 |
Dynamic类型对象 |
比ViewBag读取速度快 |
比ViewData读取数据慢 |
需要强制类型转换 |
不需要强制类型转换 |
//
// 摘要: Gets the dynamic view data dictionary.
// 返回结果: The dynamic view data dictionary.
[Dynamic]
public dynamic ViewBag { get; }
实际项目中,使用ViewData和ViewBag在Controller与View中进行数据传递,并不是最佳选择,主要有以下缺点:
1. 性能问题
ViewData中的值都是对象类型,使用之前必须强制转化为需要的类型,增加了额外的性能消耗。
2. 类型不安全
没有类型不安全就不会出现编译错误,调用时转换为其他类型,就会报出运行时错误,良好的编程经验告诉我们,错误最好在编译时铺货。
3. 破坏了Controller与View的松散耦合
MVC模式中,Controller和View是松散耦合的,即Controller不知道View的变化,View也不知道Controller的变化,但是,当使用ViewData或ViewBag进行值传递时,就需要知道写入的是什么值,从而破坏了这种松散的关系。
强类型View方式
ViewData和ViewBag所出现的问题的关键就是数据类型,因此,如果在Controlle和View之间将数据类型固定,所出现的问题就会得到解决。
View方式,是使用Controller基类中的View方法进行值传递。
使用方式为:
- Controller返回值,将返回的值作为View()的参数。
- View视图中,在代码顶部需要添加代码 @model 返回值的数据类型
- View代码中,就可以使用@Model方式来使用返回数据。
Ps:视图顶部添加代码,数据类型必须是全命名空间。也可以在Web.config文件中添加以下命名空间的配置,就可以省略命名空间的信息,只需要添加类名称即可。
<system.web.webPages.razor>
<pages pageBaseType=”…..”>
<namespace>
<add namespace=”…..”>
……
</namespace>
<pages>
</system.web.webPages.razor>
View延伸
MVC模式中,M是数据模型,负责业务逻辑,一般都对应着数据库模型,V是数据视图,仅仅是数据展示,不包含数据逻辑。而在使用View()方式传递数据时,将数据模型直接通过Controller传递给View,在一些情况下可能会违反MVC的体系架构规则。
为避免出现类似问题,解决方案是在Model和View中添加一层ViewModel,用来负责在两者间进行数据传递。Controller将Model中数据封装成ViewModel,View根据ViewModel直接展示数据,不处理数据逻辑。
ASP.NET MVC 学习笔记-5.Controller与View的数据传递的更多相关文章
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- ASP.NET MVC学习笔记-----使用自定义的View Engine
我们都知道在ASP.NET MVC中自带了Razor View Engine,Razor十分的强大,可以满足我们绝大部分的需要.但是ASP.NET MVC的高度可扩展性,使我们可以使用自定义的View ...
- ASP.NET MVC学习笔记-----Filter2
ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...
- ASP.NET MVC学习笔记-----Filter
ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...
- ASP.NET MVC学习笔记-----Filter(2)
接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
- ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能
参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-method ...
- 【转】ASP.NET MVC学习笔记-Controller的ActionResult
1. 返回ViewResult public ActionResult Index() { ViewData["Message"] = "Welcome ...
随机推荐
- javascript中数组总结
数组是所有高级语言都会有的东西,数组是JS中使用最多的类型之一,所以掌握JS中数组的用法相当有帮助: 由于JS是一门弱类型的语言,所以数组里面可以放各种不同的数据类型,比如 var a = [1993 ...
- 剑指offer面试题16:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点.解题思路:单向链表只能实现单向遍历,改变链表方向就是要把当前链表的节点指向它的前一个节点,一旦当前链表指向发生了变化,就 ...
- Akka-CQRS(0)- 基于akka-cluster的读写分离框架,构建gRPC移动应用后端架构
上一篇我们讨论了akka-cluster的分片(sharding)技术.在提供的例子中感觉到akka这样的分布式系统工具特别适合支持大量的带有内置状态的,相对独立完整的程序在集群节点上分布运算.这里重 ...
- 初探系列 — Pharbers用于单点登录的权限架构
一. 前言 就职公司 法伯科技是一家以数据科技为驱动, 专注于医药健康领域的循证咨询公司. 以数据科学家身份, 赋能医药行业. 让每位客户都能享受数据带来的价值, 洞察业务, 不止于数据, 让决策更精 ...
- Hadoop 单表关联
前面的实例都是在数据上进行一些简单的处理,为进一步的操作打基础.单表关联这个实例要求从给出的数据中寻找到所关心的数据,它是对原始数据所包含信息的挖掘.下面进入这个实例. 1.实例描述 实例中给出chi ...
- 利用python完成大学刷课(从0到完成的思路)
i春秋作家:tllm 原文来自:利用python完成大学刷课(从0到完成的思路) 最近刚刚开学,学校总是有很多让人无语的课要修,还不能不修.然后我想写一个自动修课的脚本.大佬们不要笑我 是边面向百度学 ...
- 第43节:Java学前要点
Java学前要点 01 学习Java,有人推荐去培训,有人说没用,其实有钱的,不知道如何学,或者逼不得已去的就可以,也有人自己为了不花这些钱,而选择自学,我觉得也行. 现在大部分人学东西要学的好,都是 ...
- C#不同窗体间数据传递
在做项目中经常会使用不同窗体之间的值,所以就有了传值的概念.最常见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道. 1. 如果很多窗体都需要用到某一窗体的东西,比如登录窗体记 ...
- pickle模块及其API
模块:pickle 所包含API列表: pickle.dumps : 把任意对象序列化成一个bytes pickle.dump : 直接把对象序列化后写入一个file-like Object pick ...
- angular整合环信webIM
此处有两大坑: 1.下载easemob-websdk此npm包时,并没有下载strophe.js.crypto-js.underscore这三个包,需要自己手动下载. 2.如下方标红位置所示,需要自己 ...