ASP.NET MVC View的呈现学习

到了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>@2012 Xixi. All rights reserved.</p>}

}}

</body>

</html>

//View的定义

<div>

<p>Bilibili</p>

</div>

@section Header

{<h2>Bili bili</h2>}

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

最后用一张关于Razor引擎的图让大家有个比较清晰的印象。

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

参考资料:

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

时间: 2024-11-08 11:09:00

ASP.NET MVC View的呈现学习的相关文章

ASP.NET MVC View使用Conditional compilation symbols

由于View(.cshtml)的运行时编译关系,在项目级别中定义的symbols是无法被直接使用的.需要在Web.config中添加compilerOptions(在View目录下的Web.config添加无效),该设置同样适用于ASP.NET其它技术.假如你需要一个TEST的定义,参考如下: Web.config <system.codedom> <compilers> <compiler language="c#;cs;csharp" extensio

【记录】ASP.NET MVC View 移动版浏览的奇怪问题

ASP.NET MVC View 中的一段代码: <span id="span_Id">@Model.ID</span> 没什么问题吧,浏览器浏览正常,查看元素为: <span id="span_Id">123456</span> 但如果是用手机浏览器,查看元素是这样的: <span id="span_Id"><a href="tel:123456">12

ASP.Net MVC View

ASP.Net MVC View(视图) View视图职责是向用户提供界面.负责根据提供的模型数据,生成准备提供给用户的格式界面. 支持多种视图引擎(Razor和ASPX视图引擎是官方默认给出的,其实还支持其它N种视图引擎,甚至你自己都可以写一套视图引擎) View和Action之间数据传递(前后台数据传递) 弱类型 ViewData[""] 动态型 ViewBag //dynamic 动态类型Model             后台:return View(data); //存入 V

asp.net mvc 页面内容呈现Html.Raw HtmlString

asp.net mvc 页面内容呈现Html.Raw Html.Raw内容经过页面呈现,不呈现Html标签 @Html.Raw( File.ReadAllText(Server.MapPath("~/Content/html/about.html"))) HtmlString内容不经过页面处理呈现,原样呈现,含Html标签 @(File.ReadAllText(Server.MapPath("~/Content/html/about.html"))) 或 @( ne

《ASP.NET MVC 4 实战》学习笔记 7:Ajax(上)

一.jQuery的Ajax: 1.使用jQuery形成Ajax请求: 1)新建AjaxExamples项目,添加CustomAjax控制器: namespace AjaxExamples.Controllers { public class CustomAjaxController : Controller { public ActionResult Index() { return View(); } public ActionResult PrivacyPolicy() { return P

ASP.NET MVC View中的标签(tag)

在编辑View的时候会用到各种HTML标签,如<a>,<input>,<p>等待,这些标签在ASP.NET MVC中都有对应的编程语法,它叫Razor,它是帮助我们动态的生成HTML标签,好处是可以绑定数据. 现在就让我们来复习一下HTML标签的用法:<input>, 因为它是最常用的表单标签之一,所以先从它开始. 可以移步:http://www.w3cschool.cn/htmltags/tag-label.html 看下它的定义. 基本都是用于接收用户输

《ASP.NET MVC 4 实战》学习笔记 12:结束与总结

本篇是<ASP.NET MVC 4 实战>这本书学习笔记的最后一篇,最后还是没有坚持将全书的内容学习下来... 其实后面还讲了许多内容:AutoMapper.区域.NHibernate.测试.部署等,但是我基本都搞不懂了. 当时选这本书作教材就是因为偏向实践,可越往后越偏向于理论,很多知识点没有实例也搞不懂在讲什么. 原因有三:1.学习能力不强:2.心情有点急躁:3.不知是原文就这样还是翻译的原因,很多地方的表述很奇怪,不知道到底想表达什么. 因为没有坚持下来,心情很不美丽,不过这段时间的学习

ASP.NET MVC View 和 Web API 的基本权限验证

ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Microsoft Visual Studio 2013(MVC 5 + Web API 2) 修改Web.config,增加Forms验证模式,在system.web节点中增加以下配置: <authentication mode="Forms"> <forms loginU

asp.net mvc 4 高级编程学习笔记:第三章 视图(2)

页面布局 asp.net MVC中提供了布局的支持,默认情况下才布局文件保存到 /View/Shared/目录下的_Layout.cshtml,View目录有个_ViewStart.cshtml文件,里边的代码 @{ Layout = "~/Views/Shared/_Layout.cshtml"; } 指明了此目录下的默认布局文件是谁.可以将此代码添加到具体的View文件中来修改套用的模板页. 可以将_ViewStart.cshtml文件创建到某个子目录中,用来设定此目录中所有视图的