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操作: 创建此视图: 浏览结果:
随机推荐
- 探讨Js的事件的冒泡阶段
近来看到了一个新的知识点叫Js的事件冒泡,因此决定自己来研究一番. 大家应该都知道,Js中的事件处理分为三个阶段,1:事件的捕获阶段,2:处于目标阶段,3:事件的冒泡阶段.那么什么是事件的捕获和冒泡呢 ...
- Jass 技能模型定义(—):半人马酋长的反击光环
Jass是什么? 先阐释一下什么是jass吧,百度:JASS(正确地说是JASS 2)是魔兽3的程序语言,用于控制游戏和地图的进行,也是魔兽游戏和地图的基础. 地图编辑器中摆放的单位( ...
- Execute Sql Task 的Result DataSet如何返回
Execute Sql Task的Result DataSet 主要有以下四种,当Execute Sql Task返回结果之后,需要使用SSIS Variable 来接收数据. 例子中使用的数据表代码 ...
- 我为NET狂-----大前端专帖
http://dnt.dkill.net/Article/Detail/321 本来前端的东西是不想开个专贴的,这样网友容易产生依赖,前端的东西看看书,平时仿照几个网站,遇到问题再调调增加点经验,基本 ...
- Linq语法详细
闲言碎语 近期比较忙,但还是想写点什么,就分享一些基础的知识给大家看吧,希望能帮助一些linq新手,如果有其它疑问,可以进右上角群,进行交流探讨,谢谢. 开门见山 读这篇文章之前,我先说下,每一种搜索 ...
- Easyui 让Window弹出居中与最大化后居中
easyui1.3.2版本,window的弹出不会居中了.而dialog是会居中的,我们必须为为window的open事件做扩展 代码如下:只要加入以下代码即可.如果你是看了MVC项目系列的,把他放到 ...
- 连接第二个 insance 到 first_local_net - 每天5分钟玩转 OpenStack(83)
上一节在 first_local_net 中已经部署了 cirros-vm1,今天将再部署一个instance,并验证两个 instance 的连通性. 以同样的方式 launch instance ...
- Hawk 数据抓取工具 使用说明(二)
1. 调试模式和执行模式 1.1.调试模式 系统能够通过拖拽构造工作流.在编辑流的过程中,处于调试模式,为了保证快速地计算和显示当前结果(只显示前20个数据,可在调试的采样量中修改),此时,所有执行器 ...
- struts2学习笔记--使用struts2插件实现ajax处理(返回json数据)
贴一个简单的例子,通过jquery的post调用action,定义一个对象User,有name和age属性,实例化几个对象,以json的格式返回到jsp,在前台页面显示出来,模拟用户列表. 导入相关j ...
- MySQL学习(二)SQL语句的总结
1.连接查询和关联查询连接查询:把两个表中相同的元素的连接就可以查询,使用:where里,select table1.*,table2.* from table1,table2 where table ...