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操作: 创建此视图: 浏览结果:
随机推荐
- html5的audio在safari(windows)中无效
因为mac下的safari不会有这样的问题(OSX默认都装的有QuickTime),而windows下用safari的比例实在小不用考虑. apple算是偷了一个小懒.而所谓的需要quicktime并 ...
- sizzle分析记录:关于querySelectorAll兼容问题
querySelector和querySelectorAll是W3C提供的新的查询接口 目前几乎主流浏览器均支持了他们.包括 IE8(含) 以上版本. Firefox. Chrome.Safari.O ...
- 使H1 H2等标签不换行
在网页优化中,经常要使用H标签对关键字进行优化, 可是如果是一行文字中的某个词加上了H1标记,就会换行. 可以使用下面的方法,H标签就不会强制换行了. <style type="tex ...
- 关于近段时间论坛型APP 的一段舍弃
一直以为缓存务必要做的很好,好到什么程度呢,我曾这样想,用户在下滑数刷新的时候也要做到,先加载久缓存再加载新的,同时只改变旧的某些项.这样的想法真的很好!好到我花费了三天去设计数据库和服务器的 php ...
- ios 静态库冲突的解决办法
最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被“坑”了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理 ...
- Android 学习Activity(1)activity和intent
工具是:JDK环境配置+SDK+ADT工具 一.Activity 主要作用: 1.用户与应用程序的接口 2.控件的容器 二.创建Activity要点:(在src中的目录下包里) 1.一个Activi ...
- PHP获取网站图标(favicon.ico)文件
有的网站源码中加入了这几行代码: <link rel="shortcut icon" href="/favicon.ico" type="ima ...
- 切分 Tomcat 的 catalina.out 文件,解决日志文件过大的问题
原文:http://unmi.cc/split-tomcat-catalina-out-file Linux 下使用 cronolog 工具来切分 catalina.out 这里重点介绍这种方法,具体 ...
- Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)
Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 im ...
- 使用css3的动画模拟太阳系行星公转
本文介绍使用css3的animation画一个太阳系行星公转的动画,再加以改进,讨论如何画椭圆的运行轨迹.然后分析京东和人人网使用animation的实际案例,最后结合css3的clip-path做一 ...