博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC 实现多模版的方法
阅读量:6268 次
发布时间:2019-06-22

本文共 1826 字,大约阅读时间需要 6 分钟。

需要解决的场景:

 

不用的场景下使用不用的mvc 模版。

 

目录结构希望是

/templates

     Default

     Blue

     Red 

     .....

 

当传入 “Blue” 参数的时候则调用 Blue 下面的View

 

查看 return View().. 的参数,发现可以指定 一个 IView 。

然后就有如下的代码。

            RazorView rv = new RazorView(this.ControllerContext, "~/tempate/Blue/???.cshtml", null, true, new string[] { ".cshtml", ".vbcshtml" });

            return View(rv); 

 

然后,就解决了路径的问题。

 

执行,出错,不是正确的页面文件。

 

这个错误解决方法很简单(但也浪费了我不少时间):

把 /Views 下面的 web.config 拷贝到 /templates 下 

 

 

更好一点的解决方法:

 

自己实现一个 IView。

 

  1 using System;

 2 
using System.IO;
 3 
using System.Web.Compilation;
 4 
using System.Web.Mvc;
 5 
using System.Web.WebPages;
 6 
 7 
namespace System.Web.Mvc
 8 {
 9     
public 
class ThemeRazorView : IView
10     {
11         
private 
string template;  
//模版的目录名称 
12 
13         
public ThemeRazorView(
string _template)
14         {
15             
this.template = _template;
16         }
17 
18         
public 
void Render(ViewContext viewContext, TextWriter writer)
19         {
20             
//
这个地方可以自己实现,或者从 web.config 里读取,或者从用户选择的模版中读取
21 
            
if (template.IsNullOrEmpty())
22             {
23                 template = 
"
Default
";
24             }
25             
string viewPath = 
"
~/templates/
" + template + 
"
/
" + viewContext.RouteData.GetRequiredString(
"
controller
") + 
"
/
" + viewContext.RouteData.GetRequiredString(
"
action
") + 
"
.cshtml
";
26 
27             Type viewType = BuildManager.GetCompiledType(viewPath);
28             
var page = Activator.CreateInstance(viewType) 
as WebViewPage;
29            
30             page.VirtualPath = viewPath;
31             page.ViewContext = viewContext;
32             page.ViewData = viewContext.ViewData;
33             page.InitHelpers();
34 
35             WebPageContext pageContext = 
new WebPageContext(viewContext.HttpContext, 
null
null);
36             WebPageRenderingBase startPage = StartPage.GetStartPage(page, 
"
_ViewStart
"
new 
string[] { 
"
cshtml
"
"
vbhtml
" });
37 
38             page.ExecutePageHierarchy(pageContext, writer, startPage);
39         }
40 
41     }
42 }

 

 

完成。

 

 现在调用方法为:

            return View(new ThemeRazorView("Blue")); 

 

 

 参考了:  

转载于:https://www.cnblogs.com/cloudbeer/archive/2012/09/26/2703772.html

你可能感兴趣的文章
LeetCode题解(二)
查看>>
Mybatis通用Mapper
查看>>
文件磁盘命令(就该这么学6章内容)
查看>>
2016-207-19 随笔
查看>>
java的double类型如何精确到一位小数?
查看>>
看看国外的javascript题目,你能全部做对吗?
查看>>
ffmpeg 如何选择具有相同AVCodecID的编解码器 (AVCodec)
查看>>
真正解决 Windows 中 Chromium “缺少 Google API 密钥” 的问题
查看>>
Spring 之 AOP
查看>>
软件项目管理|期末复习(二)
查看>>
直接调用VS.net2005中的配置界面
查看>>
程序员的自我修养五Windows PE/COFF
查看>>
关于字符集,编码格式,大小端的简单总结
查看>>
js string 转 int Number()
查看>>
课堂练习:ex 4-20
查看>>
20155328 2016-2017-2 《Java程序设计》 第8周学习总结
查看>>
python操作redis--string
查看>>
echarts图表初始大小问题及echarts随窗口变化自适应
查看>>
Inherits、CodeFile、CodeBehind的区别
查看>>
创建一个SimpleDlg
查看>>