posts - 43,  comments - 394,  views - 13万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

在我以前的文章中详细介绍了目前mvc框架中的视图引擎管理,这个视图引擎可以方便的实现系统多视图引擎的管理,让系统可以轻松更好视图引擎,但是,在一些应用,比如bbs,多用户blog中,往往需要提供用户自选skin的功能,比如bbs中某个用户通过菜单可以随意更换自己的skin设置,而mvc框架的默认视图管理器对这个要求就无法做到了,而本文则是使用viewengine规则来实现一个用户自选视图引擎的功能.

在本系统中,用户选择的skin信息将保存在cookie中,这意味着可以让用户控制这个选择保存的时间.

首先,这个系统仍然是基于ViewEngine,我们在以前的文章中可以看到,mvc框架用一个AutoViewEngine来管理存在的所有ViewEngine,那么我们也可以考虑用一个SelectViewEngine来管理一系列我们特定的可选择ViewEngine.下面先看看这个核心部分的类:

 


从图中可以看到,这儿我们提供了一个新的接口ISelectViewEngine,它在普通的ViewEngine上添加了一个新的Name属性,该属性标示着唯一的视图引擎名称,然后我们对WebFormViewEngine进行封装,并实现ISelectViewEngine接口:

Code

 

从上面的代码可以看到,默认的不同skin分别放在~/skins目录下,不同的SelectWebFormViewEngine对应不同的子目录.

然后我们实现一个基本的SelectViewEngine来管理所有的可选择ViewEngine,关键代码如下:

 

Code

那么我们如何确定用户选择了哪个ViewEngine呢?在本例中是采用了cookie的方式,在ViewEngineExtension中,我们封装了几个扩展方法用来获取cookie和设置cookie:

 

Code

 

总结下VIewEngine的工作流程:

Controller -> ViewEngines.Default.FindView -> SelectViewEngine.FindView -> SelectWebFormViewEngine.FindView

也就是说,系统调用FindView或者FindPartialView方法最终还是会调用到我们在系统中已经注册过的ISelectViewEngine的FindView或者FindPartialView方法.最后展示下如何注册这些SelectViewEngine:

 

Code

 

到此,所有功能实现
实例工程代码:

/Files/leven/LevenViewEngine.rar
Leven

posted on   Leven  阅读(3092)  评论(11编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
CopyRight 2008, Leven's Blog xhtml | css
Leven的个人Blog
点击右上角即可分享
微信分享提示