zoukankan      html  css  js  c++  java
  • 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")); 

  • 相关阅读:
    Python学习笔记之递归函数
    包管理工具-yum
    ElasticSearch定时清理缓存索引
    pytest实现多进程与多线程运行
    获取webView页面内窗体句柄
    文档测试
    ClickHouse 运维相关部分命令记录
    [转]contains a file system with errors, check forced
    log日志重复打印 修改
    jmeter参数化
  • 原文地址:https://www.cnblogs.com/wangluochong/p/3802907.html
Copyright © 2011-2022 走看看