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"));

ASP.NET MVC环境下实现一个网站多个网站模板的方法的更多相关文章

  1. 【工作笔记二】ASP.NET MVC框架下使用MVVM模式

    ASP.NET MVC框架下使用MVVM模式 原文:http://www.cnblogs.com/n-pei/archive/2011/07/21/2113022.html 对于asp.net mvc ...

  2. C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(下)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...

  3. 【转】ASP.NET MVC框架下使用MVVM模式-KnockOutJS+JQ模板例子

    KnockOutJS学习系列----(一) 好几个月没去写博客了,最近也是因为项目紧张,不过这个不是借口,J. 很多时候可能是因为事情一多,然后没法静下来心来去写点东西,学点东西. 也很抱歉,突然看到 ...

  4. ASP.NET MVC项目里创建一个aspx视图

    先从控制器里添加视图 视图引擎选"ASPX(C#)",使用布局或模板页不要选. 在Views\EAV目录里,生成的aspx是个单独的页面,没有代码文件,所以代码也要写在这个文件里. ...

  5. ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块

    之前的My Blog提供了列表的展示和文章显示功能,但是所有数据仍然只能通过数据库录入,为了完成最初的角色“作者”的用例,本章将介绍如何使用“Area”实现My Blog的管理功能. 根据功能分离代码 ...

  6. 【简书】在阿里云自带的CentOS + LAMP环境下部署一个Laravel项目

    在阿里云自带的CentOS + LAMP环境下部署一个Laravel项目 作者 DonnieZero 关注 2017.07.29 22:02* 字数 2218 阅读 5556评论 3喜欢 1赞赏 1 ...

  7. wamp环境下配置https证书后,网站内容访问受限

    wamp环境下配置https证书后,网站内容访问受限,点击首页链接标签后报错,大致意思是没有权限进行操作. 解决方法:打开apache的http.conf(位置大致如下:项目所在目录\bin\apac ...

  8. 在SoCEDS环境下编译和更新preloader和uboot程序的方法

    在SoCEDS环境下编译和更新preloader和uboot程序的方法   前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloade ...

  9. eclipse环境下无法创建android virtual Devices(AVD)问题解决的方法汇总

    首先,要在eclipse环境下成功的创建一个安卓虚拟机,须要有三项东西,第一就是eclipse,第二就是android SDK Manager,第三就是ADT,也就是eclipse环境下的一个安卓虚拟 ...

随机推荐

  1. week3 团队博客作业

    团队自我介绍地址: http://www.cnblogs.com/liuliudashun/p/5919555.html

  2. <转>HTML、CSS、font-family:中文字体的英文名称

    宋体 SimSun 黑体 SimHei 微软雅黑 Microsoft YaHei 微软正黑体 Microsoft JhengHei 新宋体 NSimSun 新细明体 PMingLiU 细明体 Ming ...

  3. golang 实现线程池

    package main import ( "fmt" "time" ) type Pool struct { Queue chan func() error; ...

  4. CAS单点登录的时候出现票根'ST-xxxxxx-cas'不符合目标服务

    CAS单点登录遇到问题:票根'ST-xxxxxx-cas'不符合目标服务,原因出在linux 时间未同步,差了3分钟 .

  5. python day4 ---------------文件的基本操作

    1.能调用方法的一定是对象,比如数值.字符串.列表.元组.字典,甚至文件也是对象,Python中一切皆为对象. str1 = 'hello' str2 = 'world' str3 = ' '.joi ...

  6. VMXNET3 vs E1000E and E1000

    VMXNET3 vs E1000E and E1000 用户为什么要从E1000调整为VMXNET3,理由如下: E1000是千兆网路卡,而VMXNET3是万兆网路卡: E1000的性能相对较低,而V ...

  7. 【字符串算法3】浅谈KMP算法

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法3]KMP算法 Part1 理解KMP的精髓和思想 其实KM ...

  8. 【bzoj4537】 Hnoi2016—最小公倍数

    http://www.lydsy.com/JudgeOnline/problem.php?id=4537 (题目链接) 题意 给出一个${n}$个点${m}$条边的无向图,每条边有两个权值${a,b} ...

  9. bug4 导入新工程时报 Target runtime com.genuitec.runtime.generic.jee60 is not defined

    系统加载工程后,报错Target runtime com.genuitec.runtime.generic.jee60 is not defined,在发布工程的同事电脑上正常.新导入的工程,出问题很 ...

  10. Linux上SSH登录远程服务器免密码

    在本地的客户端SSH到远程服务端时,每次都要输入用户名和密码,如果不想每次都输入密码则可以使用以下操作. 首先在本地的客户端输入 ssh-keygen [keysystem@localhost ~]$ ...