ASP.NET MVC环境下实现一个网站多个网站模板的方法

asp.net mvc下实现多个网站模板的方法,让ASP。NET一个网站有多套网站模板,不用的场景下使用不用的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;

using System.IO;

using System.Web.Compilation;

using System.Web.Mvc;

using System.Web.WebPages;

namespace System.Web.Mvc

{

public class ThemeRazorView : IView

{

private string template; //模版的目录名称

public ThemeRazorView(string _template)

{

this.template = _template;

}

public void Render(ViewContext viewContext, TextWriter writer)

{

//这个地方可以自己实现,或者从 web.config 里读取,或者从用户选择的模版中读取

if (template.IsNullOrEmpty())

{

template = "Default";

}

string viewPath = "~/templates/" + template + "/" + viewContext.RouteData.GetRequiredString("controller") + "/" + viewContext.RouteData.GetRequiredString("action") + ".cshtml";

Type viewType = BuildManager.GetCompiledType(viewPath);

var page = Activator.CreateInstance(viewType) as WebViewPage;

page.VirtualPath = viewPath;

page.ViewContext = viewContext;

page.ViewData = viewContext.ViewData;

page.InitHelpers();

WebPageContext pageContext = new WebPageContext(viewContext.HttpContext, null, null);

WebPageRenderingBase startPage = StartPage.GetStartPage(page, "_ViewStart", new string[] { "cshtml", "vbhtml" });

page.ExecutePageHierarchy(pageContext, writer, startPage);

}

}

}现在调用方法为:

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