到了View的呈现板块,感觉ASP.NET MVC的学习也进入了尾声,还是比较开心的,毕竟也有了不小收获。这部分内容相对比较简单,因为之前还专门学习过如何结合HTML5与MVC框架。前文中提到过,ActionResult的执行实际就是View呈现的入口。不同类型的ActionResult比较多,以下做个简要的介绍。

类型 简介
EmptyResult 最简单的Result,只是为了符合框架的流程。
ContentResult 可以设置ContentType为javascript, CSS等,默认将基本类型的返回值转化为ContentResult。
FileResult 包含FileContentResult, FilePathResult, FileStreamResult
JavascriptResult 在服务端动态生成javascript并作为请求的相应。
JsonResult 提供对象和Json字符串的序列化与返序列化
HttpStatusCodeResult 方便返回Http状态码
RedirectResult RedirectToRouteResult 前者是我们可以直接重定向到指定的目标地址,后者帮助我们根据注册的路由进行重定向,不提供URL参数,而提供RouteName和RouteValues。类似httpResponse的Redirect/RedirectPermanent,在SEO中,前者会使永久重定向目的地址更新为搜索引擎的索引,后则不会。

接下来介绍最重要的ViewResult以及VIewEngine的概念。View实现IView接口,其实就是一个Render方法,参数ViewContext除了常见属性外,还有两个与js相关属性(CleintValidationEnabled, UnobstrusiveJavascriptEnabled),特别的是object类型的ViewBag用了[Dynamic]特性。ViewEngine也实现了相应的接口,注意View缓存,SearchedLocations属性包含了所有的查找路径,FindView方法的的返回名称比较奇怪,ViewEngineResult,但实际的意思应该是这个Result包含View和ViewEngine信息。在另一篇管自定义ViewEngine的博文中对这一块进行了更加深入的介绍。

再则简要的介绍下Razor引擎,我们知道.cshtml文件并不能直接执行,必须先动态编译后才能使用,那么问题来了,编译成什么文件的文件名是什么,所属的程序集为什么?并存放在哪呢?

文件名为:ASP_Page_views_XXX_ActionXXX_cshtml

程序集名由代码可知:

 public static MvcHtmlString ListViewAssemblies(this HtmlHelper helper)
{
TagBuilder ul = new TagBuilder("ul");
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.StartsWith("App_Web_")))
{
//omit
}
return new MvcHtmlString(ul.ToString());
}

编译的临时文件的路径为:

"%WinDir%\Microsoft.NET\Framework\{VersionNo}\Temporary ASP.NET Files\"

可以通过如下配置,变更路径:

 <system.web>
<compilation tempDirectory="C:\XXXXXXXX"/>
</system.web>

补充一个获得编译后类型和程序集的方法,使用BuilderManager类型的静态方法GetCompiledType和GetCompiledAssembly。

View文件编译生成的类型为WebViewPage<TModel>,也就是说.cshtml编译后的类型均为以上类型。其基类WebPageExecutingBase包含Execute, Write, WriteLiteral等方法。该基类的另一个自雷WebPageRendingBase包含Layout, IsAjax, Server, Session, Profile, Cache等属性,以及输出整个页面的抽象方法ExecutePageHierarchy。

WebViewPage还有一个直接基类WebPageBase,它实现类抽象方法ExecutePageHierarchy,最终呈现的页面包含3部分内容:布局文件、开始页面View本身。蒋老师提供的一个不错的布局例子代码如下所示:

 //布局文件定义
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
</head>
<body>
@{if (IsSectionDefined("Header"))
{RenderSection("Header");}
else
{<h2>@ViewBag.Title</h2>}
@RenderBody()
@{ if(IsSectionDefined("Footer")){
@RenderSection("Footer");
}
else{<hr/><p>@ Xixi. All rights reserved.</p>}
}}
</body>
</html> //View的定义
<div>
<p>Bilibili</p>
</div>
@section Header
{<h2>Bili bili</h2>}

看到这个我才真正明白了以前在代码中的RenderBody是如何使用的,布局文件和View是如何结合的。

细节:(可以考虑插入到原有的文章中,这样比较合理哈)

Return View("NotIndex");命名视图

Return View("~/Views/Example/Index.cshtml");

简单请款下推荐使用Dynamic的ViewBag,复杂推荐强类型的ViewModel,在使用强类型时,为了方便,推荐将其加入配置文件中,如下所示。

 <pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="Sory.Entertainment.WebAPI.Models"/>
</namespaces>
</pages>

此外,比较有意思的是,可以通过Install-Package XXX命令安装自己的程序集。

视图模型部分推荐大家使用MVVM模式,尽可能的使数据扁平化,便于强类型的数据管理。

在(设定好Model后)通过基架模板Scaffold template(T4模板)新建视图时,支持Empty、Create、Delete、Details、Edit、List等类型的视图。通过设置RefenceScriptLib添加JQuery(包括非侵入版)验证等相关js。

Razor引擎简单介绍:

通过"@"进行代码和标记的转换符,@@表示原有的@,@(表达式)

表达式 值(只是示例,勿深究)
@ProductList.Length 3
@@ @,转义
Item_@(item.length) Item_3
@{ xxx } 代码块
@{ Html.RenderPartial("SomePartial"); } 代码行
@foreach(var item in items){<span>Item @item.Name</span>} 循环
@if(showMessage){<text>xxx<text>} 判断
@* ………………..*@ 注释,这个需要注意哦,不然可能会出错
@(Html.SomeMethod<Type>) 泛型需要加括号

所有后台数据的呈现默认使用HTML编码(这个html标记类型为System.Web.IHtmlString),如果遇到特殊字符,如<script>alert('hacked!')<alert>等情况,会编码为&lt;script&gt;….,如果需要原样输出,需要使用@Html.Raw(message)。这样就够了么?不然,在前端如果使用js处理后台数据时,为了防止跨站脚本攻击,还需要使用'@Ajax.JavaScriptStringEncode()'防止XSS攻击。

布局,使用在Layout页面中使用@RenderBody可以为主体占位,也可以用的@RenderSection("Footer")为Footer占位,这时需要在页面中通过@section Footer{ html内容 }设置,否则会抛出异常,一个比较合理的例子如下。

 <footer>
@if(IsSectionDefined("Footer")){RenderSection("Footer");}
Else{<span>Default Footer</span>}
</footer>

此外,还可以使用_ViewStart.cshtml页面设置布局页,它可以递归到相应的子目录中,它先于所有页面的渲染。

最后一点是,可以通过部分视图的方式,来满足Ajax调用的需要,这个需要时html文件,而仅仅是json要注意。

 <script>
$(function()){
$('#partialView').Load('/home/partial');
});
</ script >

注:本文主要供自己学习,不妥之处望见谅。

参考资料:

[1]蒋金楠. ASP.NET MVC4框架揭秘[M]. 上海:电子工业出版社, 2012. 390-444

[2](美)加洛韦. ASP.NET MVC 4高级编程(第4版)[M]. 北京:清华大学出版社, 2012.

快速入门系列--MVC--06视图的更多相关文章

  1. 快速入门系列--WebAPI--01基础

    ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...

  2. 快速入门系列--MVC--01概述

    虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...

  3. 快速入门系列--MVC--02路由

    现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...

  4. 快速入门系列--MVC--07与HTML5移动开发的结合

    现在移动互联网的盛行,跨平台并兼容不同设备的HTML5越来越盛行,很多公司都在将自己过去的非HTML5网站应用渐进式的转化为HTML5应用,使得一套代码可以兼容不同的物理终端设备和浏览器,极大的提高了 ...

  5. [转]快速入门系列--WebAPI--01基础

    本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...

  6. 快速入门系列--WebAPI--03框架你值得拥有

    接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...

  7. 快速入门系列--WebAPI--04在老版本MVC4下的调整

    WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...

  8. vue 快速入门 系列 —— 虚拟 DOM

    其他章节请看: vue 快速入门 系列 虚拟 DOM 什么是虚拟 dom dom 是文档对象模型,以节点树的形式来表现文档. 虚拟 dom 不是真正意义上的 dom.而是一个 javascript 对 ...

  9. vue 快速入门 系列 —— 初步认识 vue

    其他章节请看: vue 快速入门 系列 初步认识 vue vue 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. 所谓渐进式,就是你可以一步一步.有阶段 ...

  10. vue 快速入门 系列 —— 侦测数据的变化 - [基本实现]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [基本实现] 在 初步认识 vue 这篇文章的 hello-world 示例中,我们通过修改数据(app.seen = false),页面中 ...

随机推荐

  1. HTML5中id可以用数字开头,但在css中不能正常使用

    昨晚在看<响应式Web设计:html5和css3实战>时,书中提到“HTML5中的ID指可以用数字开头”.这个还真不知道,于是测试了一下,发现了问题. 在H5描述中是这样说的: 在css样 ...

  2. Java反射机制调用private类型的构造方法

    单例类: package singleton; public class SingletonTest { // 私有构造方法 private SingletonTest(){ System.out.p ...

  3. JDK和环境配置

    1. JASE : J2SE 这个就是我们现在在学的东西,他是一切Java的核心基础 JAME :J2ME : 他是Java的一个微型版,主要用来做移动开发 JAEE :J2EE Java企业版本,主 ...

  4. android 开发禁止系统修改app的字体大小

    重写activity的getResources方法,一般在BaseActivity中重写就好了,其他activity继承BaseActivity //设置字体大小不随手机设置而改变 @Override ...

  5. Android学习地址

    Google Android官方培训课程中文版http://hukai.me/android-training-course-in-chinese/

  6. HTML5的文档结构和新增标签

    一.HTML5 文档结构1.第一步:打开 开发工具,打开指定文件夹:2.第二步:保存 index.html 文件到磁盘中,.html 是网页后缀:3.第三步:开始编写 HTML5 的基本格式.< ...

  7. Word文字处理器发展演变

    随着信息技术的不断发展,以前书面化的信笺,笔记,书籍以及作业演变成现在不断更新的电子化Word文档. Word是目前世界上最流行.最常用的文字编辑,排版软件,使用它不仅可以提高文档的编辑效率,在修改时 ...

  8. Inno调用dll --- 实现背景播放音乐

    Inno 播放音乐可以调用系统api函数mciSendString来实现,而mciSendString函数存在C:\Windows\System32\winmm.dll中,因此最终只要成功从该dll文 ...

  9. Linux文件目录权限总结

    代表字符 权限 对文件含义 对目录含义  r 读权限 允许查看文件内容 允许列出目录中内容 w 写权限 允许修改文件内容 允许在目录中创建或删除文件 x 执行权限 允许执行文件 允许进入目录

  10. 微小企业中Sqlserver2000服务器的日常备份与恢复

    1:把数据库和备份分别放在二个硬盘上 2:不要相信用户会使用客户端坚持备份数据,比较靠谱的方法是为数据库建立维护计划 3:数据库采用每天完全备份,并且时间一定要选择在用户肯定开机的时候,因为很多用户晚 ...