视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
NopCommerce架构分析之(六)自定义RazorViewEngine和WebViewPage
2020-11-27 22:37:53 责编:小采
文档

系统中对Razor的支持包括两部分,其中之一就是自定义RazorViewEngine

一、自定义RazorViewEngine

在Global.asax.cs的Application_Start方法中,注册了自定义视图引擎:

//remove all view engines 
ViewEngines.Engines.Clear(); 
//except the themeable razor view engine we use 
ViewEngines.Engines.Add(new ThemeableRazorViewEngine());

ThemeableRazorViewEngine继承ThemeableBuildManagerViewEngine,

ThemeableBuildManagerViewEngine继承ThemeableVirtualPathProviderViewEngine

ThemeableVirtualPathProviderViewEngine继承VirtualPathProviderViewEngine,达到对虚拟路径解析的目的。

说到ASP.NET MVC中的视图引擎(ViewEngine),就不得不说IView和IViewEngine这两个接口,要实现自定义的视图引擎就必须要实现这两个接口:

IView接口:IView是对MVC结构中View对象的抽象,此接口只有一个方法:void Render(ViewContext viewContext, TextWriter writer);Render方法将页面HTML写入到Writer中供浏览器显示;

IViewEngine接口:IViewEngine接口的职责是寻找View对象,编写自己的视图引擎时可以继承自IViewEngine并重写该类的FindView和FindPartialView方法,这两个方法返回一个ViewEngineResult表示搜索结果。

ASP.NET MVC提供了两个实现了IViewEngine接口的类:VirtualPathProviderViewEngine和WebFormViewEngine。VirtualPathProviderViewEngine类实现了FindView和FindPartialView这两个方法,用于根据指定的路径和格式来搜索页面文件,并且提供了Cache机制来缓存数据(由于使用的是ASP.NET Cache,依赖于HttpContext,所以无法在WebService或WCF项目中使用)。

VirtualPathProviderViewEngine寻找页面的时候,具体从哪些路径下进行寻找其实是根据该类中的这三个属性来决定的:MasterLocationFormats、ViewLocationFormats、PartialViewLocationFormats,修改这三个属性可以给我们的视图引擎分配自定义的搜索路径和文件格式。

二、自定义类WebViewPage<TModel>

此类表示呈现使用ASP.NET Razor语法的视图所需的属性和方法。

所以每一个视图都应该继承此类。但是我们在项目中是看不到此继承的,默认情况下Razor会让视图继承自System.Web.Mvc.WebViewPage<TModel>基类。也可以通过修改视图目录(每一个asp.net mvc项目下面都有一个~/Views/目录)下的web.config文件来更改默认基类,NopCommerce就是使用此方法实现自定义WebViewPage类的。除此之外也可以在视图文件中引入命名空间,但这种方法比较繁琐,除非一个项目中有个别视图需要自定义WebViewPage。

下载本文
显示全文
专题