Mvc视图的那些事
最近参与项目底层重写,在代码组织方式,类型使用上已经与之前有了很大的不同,这里总结一下视图的使用。
一、视图中命名空间的使用
视图命名空间的使用方式大致有三种:一,完全限定名,如 @System.Data.DataTable;二,在视图顶部使用using的方式,如@using System.Data;三,在Views根目录namespaces节点下添加,如<add namespace="System.Data" />。对于第一种方式,除非可能引发引用的歧义,否则强烈的不推荐使用,这种方式一方面会使代码看起来混乱,难以理清程序集间的依赖关系,另外也不利于维护。在本次改版中,新老命名空间的替换无疑增大了工作量。第二种方式命名空间的作用范围为当前视图页,如果命名空间将要中大多数视图页中使用的话建议采用第三种方式,作用范围为Views下的所有视图页。在采用第二种方式时建议将using部分放在视图的最顶部,在采用第三种方式时刚加上引用在视图中不起作用,可以将视图关闭再打开即可。
二、ViewBag与ViewData的使用
ViewData是ViewDataDictionary类型,该类型实现了IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, IEnumerable<KeyValuePair<string, object>>, IEnumerable4个接口,之所以不定义为Dictionary类型是因为ViewDataDictionary具有下面的属性
//
// 摘要:
// 获取或设置与视图数据关联的模型。
//
// 返回结果:
// 与视图数据关联的模型。
public object Model { get; set; }
我们可以使用标准的字典语法设置或读取其中的值,但Mvc3有更简单的语法-ViewBag,ViewBag是动态类型,是对ViewData的动态封装器。大多数情况下这两种语法并不存在什么技术差异,但对于ViewData["Fang Tian Xia"],ViewBag就无法访问,因为ViewData的键不符合C#标识符规范,另外ViewBag不能作为一个参数传递给扩展方法,这个时候需要类型转换或ViewData。由于ViewBag及ViewData没有智能感识,对于中视图中经常使用的需要参与到表达式语句块中的值建议提前进行类型转换。
三、强类型视图
由于ViewBag及ViewData缺乏智能感识,有时还要进行类型转换,颇有不便,就产生了强类型视图。强类型视图在添加视图时选上创建强类型视图,然后选择要传递的类型即可。然而对于刚刚创建的类型,vs中选择类型时并不能找到我们的类型,需要生成项目以后才可以在选项中找到。如果项目还不能编译通过,可以手动的写在视图顶部 如@model MvcTest.Models.Users,中@model后面跟的是类型的完全限定名,除非该命名空间已经using,否则需要命名空间加类名,看Model的定义可以知道,Model为泛型。
public abstract class WebViewPage<TModel> : WebViewPage
...
//
// 摘要:
// 获取关联的 System.Web.Mvc.ViewDataDictionary 对象的 Model 属性。
//
// 返回结果:
// 关联的 System.Web.Mvc.ViewDataDictionary 对象的 Model 属性。
public TModel Model { get; }
另外在return View(entity);中不要将字符串的类型作为强类型传递,因
//
// 摘要:
// 使用模型创建一个将视图呈现给响应的 System.Web.Mvc.ViewResult 对象。
//
// 参数:
// model:
// 视图呈现的模型。
//
// 返回结果:
// 视图结果。
protected internal ViewResult View(object model);
//
// 摘要:
// 使用视图名称创建一个呈现视图的 System.Web.Mvc.ViewResult 对象。
//
// 参数:
// viewName:
// 为响应呈现的视图的名称。
//
// 返回结果:
// 视图结果。
protected internal ViewResult View(string viewName);
四、局部视图
mvc没有webform中的那种控件,可以替代的有局部视图和函数。局部视图相比普通视图只是少了head、body标签,不能使用母版页而已,它的使用方式有
@{ Html.RenderPartial("PartialViewName",Model); },这个不经过action,也可以Html.RenderAction渲染视图,这个需要经过action。在ajax中可以这么用
$("#result").load("/home/message",function(){ //加载完之后隐藏进度条 });
值得一提的是,局部视图的调用不能像webform控件那样可以调用里面的函数或属性字段做返回值。这就要求我们把代码重用尽可能放到类和函数这一级,尽可能的降低不同模块之间的耦合。
Mvc视图的那些事的更多相关文章
- ABP文档 - Mvc 视图
文档目录 本节内容: 简介 AbpWebViewPage 基类 简介 ABP通过nuget包Abp.Web.Mvc集成到Mvc视图里,你可以像往常那样创建常规的视图. AbpWebViewPage 基 ...
- ASP.NET MVC 视图(五)
ASP.NET MVC 视图(五) 前言 上篇讲解了视图中的分段概念.和分部视图的使用,本篇将会对Razor的基础语法简洁的说明一下,前面的很多篇幅中都有涉及到视图的调用,其中用了很多视图辅助器,也就 ...
- ASP.NET MVC 视图(四)
ASP.NET MVC 视图(四) 前言 上篇对于利用IoC框架对视图的实现进行依赖注入,最后还简单的介绍一下自定义的视图辅助器是怎么定义和使用的,对于Razor语法的细节和辅助器的使用下篇会说讲到, ...
- ASP.NET MVC 视图(三)
ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...
- ASP.NET MVC 视图(二)
ASP.NET MVC 视图(二) 前言 上篇中对于视图引擎只是做了简单的演示,对于真正的理解视图引擎的工作过程可能还有点模糊,本篇将会对由MVC框架提供给我们的Razor视图引擎的整个执行过程做一个 ...
- ASP.NET MVC 视图(一)
ASP.NET MVC 视图(一) 前言 从本篇开始就进入到了MVC中的视图部分,在前面的一些篇幅中或多或少的对视图和视图中的一些对象的运用进行了描述,不过毕竟不是视图篇幅说的不全面,本篇首先为大家讲 ...
- MVC视图展现模式之移动布局解析-续集
网站就必须用响应式布局吗?MVC视图展现模式之移动布局:http://www.cnblogs.com/dunitian/p/5213787.html demo:http://pan.baidu.com ...
- ABP理论学习之MVC视图
返回总目录 本篇目录 介绍 AbpWebViewPage基类 介绍 ABP通过Abp.Web.Mvc Nuget包集成了MVC视图.因此你可以像常规那样创建MVC视图. AbpWebViewPage基 ...
- 为ASP.NET MVC视图输出json
做个小小练习,为asp.net mvc视图输出json字符串: 创建JsonResult操作: 创建此视图: 浏览结果:
随机推荐
- jQuery DateTimePicker 日期和时间插件
jQuery UI很强大,其中的日期选择插件Datepicker是一个配置灵活的插件,我们可以自定义其展示方式,包括日期格式.语言.限制选择日期范围.添加相关按钮以及其它导航等. 日期选择插件是一个配 ...
- Java环境变量
很简单的问题!配置Java环境变量 准备 下载安装Java,官方地址 打开系统环境变量,我的电脑右键 JAVA_HOME 添加JAVA_HOME,设置jdk安装目录,比如"C:\Progra ...
- 模拟jsonp的实现
function prescript(s) { if (s.cache === undefined) { s.cache = false; } if (s.crossDomain) { s.type ...
- 前端MVVM框架设计及实现(一)
最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的avalon开始了,我记得还是去年6月写过一个系列的av ...
- window下Nodejs的部署
nodejs http://nodejs.org/#download npm node cli.js install npm -gf //可以安装最新版的NPM node cli.js install ...
- Makefile
原文链接:http://www.orlion.ga/816/ 一.基本规则 对于一个拥有多个文件的c项目,编译时可能是这样的指令: gcc main.c stack.c -o main 如果编译之后又 ...
- lintcode最长回文子串(Manacher算法)
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...
- Android sendevent/getevent 用法
前言:最近在弄一个模拟用户点击屏幕的功能,并且不需要用户点击屏幕,后台自动给输入框赋值,类似pc端按键精灵的功能,在网上找了很多人的资料,写的都不是太详细,一知半解.还要自己慢慢研究.于是我这边写一篇 ...
- JQuery EasyUI datagrid 复杂表头处理
下面是我项目中和网上收集的EasyUI的表头处理的,合适的拿去用吧. 例子1: $('#day_health').datagrid({ url: "sqb_b ...
- react+reflux入门教程
为了简化react的flux带来的冗余操作,社区的同仁们给我们带来了很多优秀的轮子,诸如redux,reflux等.今天我们就通过逐行讲解代码实例的方法,感受一番reflux的设计之美. 例子 这个例 ...