最近参与项目底层重写,在代码组织方式,类型使用上已经与之前有了很大的不同,这里总结一下视图的使用。

一、视图中命名空间的使用

视图命名空间的使用方式大致有三种:一,完全限定名,如 @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视图的那些事的更多相关文章

  1. ABP文档 - Mvc 视图

    文档目录 本节内容: 简介 AbpWebViewPage 基类 简介 ABP通过nuget包Abp.Web.Mvc集成到Mvc视图里,你可以像往常那样创建常规的视图. AbpWebViewPage 基 ...

  2. ASP.NET MVC 视图(五)

    ASP.NET MVC 视图(五) 前言 上篇讲解了视图中的分段概念.和分部视图的使用,本篇将会对Razor的基础语法简洁的说明一下,前面的很多篇幅中都有涉及到视图的调用,其中用了很多视图辅助器,也就 ...

  3. ASP.NET MVC 视图(四)

    ASP.NET MVC 视图(四) 前言 上篇对于利用IoC框架对视图的实现进行依赖注入,最后还简单的介绍一下自定义的视图辅助器是怎么定义和使用的,对于Razor语法的细节和辅助器的使用下篇会说讲到, ...

  4. ASP.NET MVC 视图(三)

    ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...

  5. ASP.NET MVC 视图(二)

    ASP.NET MVC 视图(二) 前言 上篇中对于视图引擎只是做了简单的演示,对于真正的理解视图引擎的工作过程可能还有点模糊,本篇将会对由MVC框架提供给我们的Razor视图引擎的整个执行过程做一个 ...

  6. ASP.NET MVC 视图(一)

    ASP.NET MVC 视图(一) 前言 从本篇开始就进入到了MVC中的视图部分,在前面的一些篇幅中或多或少的对视图和视图中的一些对象的运用进行了描述,不过毕竟不是视图篇幅说的不全面,本篇首先为大家讲 ...

  7. MVC视图展现模式之移动布局解析-续集

    网站就必须用响应式布局吗?MVC视图展现模式之移动布局:http://www.cnblogs.com/dunitian/p/5213787.html demo:http://pan.baidu.com ...

  8. ABP理论学习之MVC视图

    返回总目录 本篇目录 介绍 AbpWebViewPage基类 介绍 ABP通过Abp.Web.Mvc Nuget包集成了MVC视图.因此你可以像常规那样创建MVC视图. AbpWebViewPage基 ...

  9. 为ASP.NET MVC视图输出json

    做个小小练习,为asp.net mvc视图输出json字符串: 创建JsonResult操作: 创建此视图: 浏览结果:

随机推荐

  1. Knockout中文开发指南(完整版API中文文档) 目录索引

    a, .tree li > span { padding: 4pt; border-radius: 4px; } .tree li a { color:#46cfb0; text-decorat ...

  2. 今日提及之动画animation

    今天没有说什么内容,只是对HTML5的细节补充,如HTML结构的可以省略到最大的地步 <!DOCTYPE html><meta charset="UTF-8"&g ...

  3. Sql Server系列:视图

    视图是数据库中的一种虚拟表,与真实的表一样,视图包含一系列带有名称的行和列数据.行和列数据用来自定义视图的查询所引用的表,并且在引用视图时动态生成. 1. 视图的概念 视图是从一个或者多个表中导出的, ...

  4. FragmentPagerAdapter+ViewPager实现Tab切换效果

    1.Activity  加载布局文件,获取Viewpager控件   给ViewPager填充适配器. import android.app.ActionBar; import android.app ...

  5. 《JavaScript语言精粹》小记

    一.前言 以下内容均摘自<JavaScript语言精粹>一书,本人在读这本书时,发现作者诠释JavaScript很犀利,特别是数组部分,固记录下来,想和大家分享下. 随笔主要包含两大部分: ...

  6. iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流

    上篇博客的实例是自带的UICollectionViewDelegateFlowLayout布局基础上来做的Demo, 详情请看<iOS开发之窥探UICollectionViewControlle ...

  7. VARCHAR列上的索引

    一年前,我写了在索引的导航结构里,SQL Server如何存储VARCHAR列.我们都知道,在SQL Server里索引(聚集索引,非聚集索引)的键列有最大900byte的大小限制. 假设现在你想捉弄 ...

  8. 在Pycharm中使用GitHub

    Pycharm是当前进行python开发,尤其是Django开发最好的IDE.GitHub是程序员的圣地,几乎人人都在用. 本文假设你对pycharm和github都有一定的了解,并且希望在pycha ...

  9. 文件权限及chmod使用方法

    文件权限 在linux在,由于安全控制需要,对于不同的文件有不现的权限,限制不同用户的操作权限,总共有rwxXst这一些权限,我们经常使用到的是rwx,对于文件和文件夹而言,他们代表着不同的含义 对于 ...

  10. Angularjs学习笔记9_JSON和JSONP

    说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?数据可以用自定义字符串或者用XML来描述,跨域可以通过服务器端代理来解决.最被推崇或者说首选的 ...