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操作: 创建此视图: 浏览结果:
随机推荐
- react UI交互 简单实例
<body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ...
- 在不动用sp_configure的情况下,如何 =》去掉列的自增长,并保留原数据
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html 后期博客首发:http://dnt.dkill.net/Article/Det ...
- 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- WCF 实体更改发布后,如何不影响调用方?
应用场景:使用 WCF 有一个坏处,就是如果我们经常对 WCF 应用程序更新,有时候调用方也要进行 Update Service,但调用方往往会很多,那么这个工作就会很讨厌,比如 WCF Servic ...
- TCP ,UDP概念和TCP三次握手连接 的知识点总结
OSI 计算机网络7层模型 TCP/IP四层网络模型 传输层提供应用间的逻辑通信(端到端),网络层提供的是主机到主机的通信,传输层提供的是可靠服务. TCP 中常说的握手指的是:连接的定义和连接的建立 ...
- Android之消息机制Handler,Looper,Message解析
PS:由于感冒原因,本篇写的有点没有主干,大家凑合看吧.. 学习内容: 1.MessageQueue,Looper,MessageQueue的作用. 2.子线程向主线程中发送消息 3.主线程向子线程中 ...
- 自定义iOS 中推送消息 提示框
看到标题你可能会觉得奇怪 推送消息提示框不是系统自己弹出来的吗? 为什么还要自己自定义呢? 因为项目需求是这样的:最近需要做 远程推送通知 和一个客服系统 包括店铺客服和官方客服两个模块 如果有新的消 ...
- [Web API] Web API 2 深入系列(7) Model绑定(下)
目录 ModelBinder ModelBinderProvider 不同类型的Model绑定 简单类型 复杂类型 其他类型 ModelBinder ModelBinder是Model绑定的核心. p ...
- 关于SQL储存过程中输出多行数据
declare @num1 int --为符合条件的总行数 select @num1=COUNT(1) from cardInfo where openDate between @ ...
- Android使用ViewPager实现左右循环滑动及轮播效果
边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其 ...