Razor是Asp.net MVC中新的默認模板類型, 語法簡單易用。這篇文章不涉及Razor的語法,主要介紹Razor的一些在MVC項目中的使用技巧,以及脫離MVC環境下,如何使用Razor.html
閱讀目錄:git
1、Razor和MVC關係github
2、MVC中擴展Razor尋找模板範圍設計模式
3、MVC中使用Razor生成Html片斷mvc
4、脫離MVC, 使用Razor獨立做爲模板引擎學習
5、其它ui
Razor是MVC中的默認模板引擎,MVC中還有ASPX模板引擎,在早期的MVC版本中,默認使用的是ASPX模板引擎。
當默認添加一個View文件的時候,能夠看到MVC默認帶的2個模板引擎。this
你還能夠引入其它的模板引擎到MVC項目中來, MVCContrib項目是一個對MVC進行擴展的項目, 項目的地址是:http://mvccontrib.codeplex.com
這裏有它提供的一份MVC中能夠擴展的模板引擎列表。spa
總之,這裏想說的是,模板引擎是獨立的,它們甚至是獨立的項目,由不一樣的公司和組織來開發。你能夠在MVC中使用你熟悉的模板引擎。
下面主要是關於Razor在MVC中的一些使用技巧。.net
看下面這個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等,你們能夠試試看。
項目中經常會用到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);
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!」
這篇文章主要是在Razor實際使用過程當中,一些學到到知識,拿來這裏分享. 沒有涉及Razor的語法這些內容,你們能夠自行搜索,網上有不少介紹的文章。
關於代碼生成器的一些我的見解,之前在看到代碼生成器的時候,以爲是個好東西,很是牛,可以減小很多工做量。後來在深刻的學習以後,發現必要性不是很大,若是程序中的代碼不少是須要生成的,那麼可能大部分都是重複和類似的代碼,這些代碼應該是能夠經過設計模式來重構精簡的。
避免使用代碼生成器,不止可以精簡代碼,還能爲你打開另一道門,你們不妨試試。