Asp.net MVC Razor模板引擎技巧分享
Razor是Asp.net MVC中新的默认模板类型, 语法简单易用。这篇文章不涉及Razor的语法,主要介绍Razor的一些在MVC项目中的使用技巧,以及脱离MVC环境下,如何使用Razor.
阅读目录:
一、Razor和MVC关系
二、MVC中扩展Razor寻找模板范围
三、MVC中使用Razor生成Html片段
四、脱离MVC, 使用Razor独立作为模板引擎
五、其它
1. Razor和MVC关系
Razor是MVC中的默认模板引擎,MVC中还有ASPX模板引擎,在早期的MVC版本中,默认使用的是ASPX模板引擎。
当默认添加一个View文件的时候,可以看到MVC默认带的2个模板引擎。
你还可以引入其它的模板引擎到MVC项目中来, MVCContrib项目是一个对MVC进行扩展的项目, 项目的地址是:http://mvccontrib.codeplex.com这里有它提供的一份MVC中可以扩展的模板引擎列表。
总之,这里想说的是,模板引擎是独立的,它们甚至是独立的项目,由不同的公司和组织来开发。你可以在MVC中使用你熟悉的模板引擎。
下面主要是关于Razor在MVC中的一些使用技巧。
2. MVC中扩展Razor寻找模板范围
看下面这个Controller中的Action方法:
public class TestController : Controller
{
public ActionResult Index()
{
return View();
}
}
这是一个简单的Action方法Index, 其中的return View()方法会将流程转向View Engine来处理。如果我们没有创建一个View\Test\Index.cshtml文件,则会出现下面的错误页面:
从上面很容易看出来,MVC默认支持的view类型, aspx, ascx, cshtml和vbhtml.
以及找寻对应View的路径规则是:
~View/{Controller}/{Action}
~View/Shared/{Action}
然而在现实开发中,使用默认的查找View路径,就完全限定住了View的层级结构,不适合复杂项目的开发。
比如在Shared共享的View文件夹中,希望再细分为Partial, Common, Email, EditorTemplate等
比如在每个Controller对应的文件夹中,你希望在添加一个文件夹为Partial,用来存放那些呈现页面某个部分的view文件。
你只需要在Global.asax.cs文件中的Application_Start方法中,添加几行代码就可以了。
protected void Application_Start()
{
……………….
ViewEngines.Engines.Add(
new RazorViewEngine
{
PartialViewLocationFormats = new[]
{
"~/Views/{1}/Partial/{0}.cshtml",
"~/Views/Shared/Partial/{0}.cshtml",
"~/Views/Shared/Common/{0}.cshtml",
"~/Views/Shared/Email/{0}.cshtml",
"~/Views/Shared/EditorTemplate/{0}.cshtml"
}
});
}
上面中的{1}是Controller, {0}对应的是Action.
看看下面这张图, 可以看出来,还有很多其它的扩展点,Area, FileExtensions等,大家可以试试看。
3. MVC中使用Razor生成Html字符串
项目中常常会用到Ajax局部刷新页面的情况,如果只是刷新一个局部区域,还比较简单,可以使用一个对应的Action来响应Ajax请求,获取刷新的html内容,但是如果是需要刷新页面中的多个区域的时候,怎么办呢? 这个时候,我们希望后台返回的结果是一个类似这样的Json格式.
return Json(new
{
Success = true,
Message = "Sucess",
HtmlPart1 = ……..
HtmlPart2 = …….
}, JsonRequestBehavior.AllowGet);
要解决这个问题,可以非常方便的使用下面的Controller扩展方法解决:
public static class ControllerExtension
{
/// <summary>
/// Renders a (partial) view to string.
/// </summary>
/// <param name="controller">Controller to extend</param>
/// <param name="viewName">(Partial) view to render</param>
/// <returns>Rendered (partial) view as string</returns>
public static string RenderPartialViewToString(this ControllerBase controller, string viewName)
{
return controller.RenderPartialViewToString(viewName, null);
} /// <summary>
/// Renders a (partial) view to string.
/// </summary>
/// <param name="controller">Controller to extend</param>
/// <param name="viewName">(Partial) view to render</param>
/// <param name="model">Model</param>
/// <returns>Rendered (partial) view as string</returns>
public static string RenderPartialViewToString(this ControllerBase controller, string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = controller.ControllerContext.RouteData.GetRequiredString("action"); controller.ViewData.Model = model; using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw); return sw.GetStringBuilder().ToString();
}
}
}
那么上面的返回结果,就可以改成:
return Json(new
{
Success = true,
Message = "Sucess",
HtmlPart1 = this.RenderPartialViewToString("_HtmlPart1", model1),
HtmlPart2 = this.RenderPartialViewToString("_HtmlPart2", model2), }, JsonRequestBehavior.AllowGet);
4. 脱离MVC, 使用Razor独立作为模板引擎
RazorEngine是一个独立的开源项目,项目的地址是https://github.com/Antaris/RazorEngine它是基于微软的Razor之上,包装而成的一个可以独立使用的模板引擎。也就是说,保留了Razor的模板功能,但是使得Razor脱离于Asp.net MVC,能够在其它应用环境下使用。我现在一般这个来生成Email文本,当然也有人用来做代码生成器。
使用也非常简单:
string template = "Hello @Model.Name! Welcome to Razor!";
string result = Razor.Parse(template, new { Name = "World" });
上面result的结果就是 “Hello World! Welcome to Razor!”
5. 其它
这篇文章主要是在Razor实际使用过程中,一些学到到知识,拿来这里分享. 没有涉及Razor的语法这些内容,大家可以自行搜索,网上有很多介绍的文章。
关于代码生成器的一些个人看法,以前在看到代码生成器的时候,觉得是个好东西,非常牛,能够减少不少工作量。后来在深入的学习之后,发现必要性不是很大,如果程序中的代码很多是需要生成的,那么可能大部分都是重复和相似的代码,这些代码应该是可以通过设计模式来重构精简的。
避免使用代码生成器,不止能够精简代码,还能为你打开另外一道门,大家不妨试试。
Asp.net MVC Razor模板引擎技巧分享的更多相关文章
- [转]MVC Razor模板引擎 @RenderBody、@RenderPage、@RenderSection及Html.RenderPartial、Html.RenderAction
本文参考自下面文章整理 MVC Razor模板引擎 @RenderBody.@RenderPage.@RenderSection及Html.RenderPartial.Html.RenderActio ...
- MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式
MVC的验证(模型注解和非侵入式脚本的结合使用) @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...
- MVC Razor模板引擎输出HTML或者生产HTML文件
以前做CMS的时候都会根据模板来生成输出HTML或者生成HTML文件. 常用的引擎有VTemplate.NVelocity等等,这个我就布做介绍了. 这里我想说的是.当mvc出现Razor模板引擎的时 ...
- ASP.NET MVC Razor视图引擎攻略
--引子 看下面一段MVC 2.0的代码. <%if (Model != null){%> <p><%=Model%></p><%}%>&l ...
- ASP.NET MVC——Razor视图引擎
Razor是MVC框架视图引擎,我们今天就来说一说Razor视图引擎. 首先还是来创建一个基础项目叫Razor来演示. 先来定义一个Model叫Product public class Product ...
- MVC Razor模板引擎 @RenderBody、@RenderPage、@RenderSection及Html.RenderPartial、Html.RenderAction
一.Views文件夹 -> Shared文件夹下的 _Layout.cshtml 母版页 @RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合 ...
- Asp.Net MVC Razor视图引擎与My97DatePicker插件的结合
using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System. ...
- ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 视图模板页
https://www.cnblogs.com/xlhblogs/archive/2013/06/09/3129449.html MVC Razor模板引擎 @RenderBody.@RenderPa ...
- 脱离MVC使用Razor模板引擎
关于Razor模板引擎 1.简介 模板引擎:Razor.Nveocity.Vtemplate.Razor有VS自动提示.使用起来会方便一点. 但是Razor大多是在MVC下使用的. 那么如何在非MVC ...
随机推荐
- OS初识
参考: 操作系统的故事(1-4):
- html5学习笔记(3)--主题结构元素-1
Article元素 以下为对应代码: <!DOCTYPE html> <html> <head lang="en"> <meta char ...
- 实用的Scala泛函编程
既然谈到实用编程,就应该不单止了解试试一个新的编程语言那么简单了,最好通过实际的开发项目实例来演示如何编程.心目中已经有了一些设想:想用Scala泛函编程搞一个开源的数据平台应用系统,也就是在云平台P ...
- javascript--Object
概述 (1)定义 对象(object)是JavaScript的核心概念,也是最重要的数据类型.JavaScript的所有数据都可以被视为对象. 简单说,所谓对象,就是一种无序的数据集合,由若干个&qu ...
- php自动载入类的实践
<?php //function __autoload($class_name) {// require_once $class_name . '.php';//} spl_autoloa ...
- myeclipse打红叉
因为还没有告诉myeclipse去验证它.解决方法,选中js文件,右键Myeclipse--ManaValidation--ExcludeResource--(选中全部或者那个js)--OK
- Servlet过滤器Filter用法
1 Servlet 过滤器方法 过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类.javax.servlet.Filter 接口定义了三个方法:public void ...
- xshell 通过ssh连接 ubuntu15_x64
参考: http://www.cnblogs.com/wuyuegb2312/archive/2013/03/28/2986963.html 中文乱码在客户端xshell解决:http://jingy ...
- Web 开发最有用的50款 jQuery 插件集锦——《综合篇》
这篇文章是<Web 开发最有用的50款 jQuery 插件集锦>系列的最后一篇,整个系列向大家分享了在网站开发中非常有帮助的 50 款 jQuery 插件,这些插件按用途主要有以下类别:网 ...
- 【追寻javascript高手之路01】javascript参数知多少?
前言 我最近在思考一个问题,我本身平时还是积累了不少东西,面试时候问的东西基本逃不出写的博客(当然,高级阶段的就不行了),但是真的被问到时我却不一定答得上来. 知道且能回答,回答的效果都不是很好... ...