NopCommerce架构分析之(六)自定义RazorViewEngine和WebViewPage
作者:WalsonTung 时间:2024-05-03 15:31:10
系统中对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。
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
python3之Splash的具体使用
![](https://img.aspxhome.com/file/2023/5/131705_0s.png)
服务器响应HTTP的类型ContentType大全
mysql中order by与group by的区别
Python使用pyserial进行串口通信的实例
MySQL删除数据Delete与Truncate语句使用比较
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
Python 如何实现访问者模式
给Python初学者的一些编程技巧
实例讲解如何配置MySQL数据库主从复制
asp如何读取文本文件的内容?
MYSQL导入导出sql文件简析
用yum安装MySQLdb模块的步骤方法
ASP生成静态网页的方法
Pytorch实现ResNet网络之Residual Block残差块
原创一个js对联广告类(兼容FireFox)
Numpy 三维数组索引与切片的实现
![](https://img.aspxhome.com/file/2023/1/115201_0s.png)
使用python itchat包爬取微信好友头像形成矩形头像集的方法
![](https://img.aspxhome.com/file/2023/7/131267_0s.jpg)
jQuery自适应轮播图插件Swiper用法示例
![](https://img.aspxhome.com/file/2023/6/135856_0s.png)
python实现数字炸弹游戏程序
![](https://img.aspxhome.com/file/2023/0/135020_0s.jpg)