2011-03-29 80 views
1

当前我正在开发一个较旧的ASP.NET MVC 1应用程序,以添加主题支持。我浏览过网页,并且能够构建自己的ViewEngine,它迄今为止工作得很好。我的手只有一个问题。ASP.NET MVC 1的主题支持,获取视图主人名称

我已经覆盖以下方法WebFormViewEngine:

public override ViewEngineResult FindView(
    ControllerContext controllerContext, 
    string viewName, 
    string masterName, 
    bool useCache) 

在这种方法我设置的位置格式的主题支持。不幸的是,masterName参数始终为空!所以我需要检查

if (string.IsNullOrEmpty(masterName))  
    masterName = "Site"; 

总是由我自己来使发动机工作。但是,由于我有几个主文件,只要视图需要另一个主站而不是“站点”,该解决方案就很糟糕。 有没有人知道,我怎样才能在这个方法中获得主视图名称?

回答

2

自己解决。大量的研发后,我发现下面的代码段,这让我:

private void RenderViewPage(ViewContext context, ViewPage page) 
      { 
       if (!String.IsNullOrEmpty(MasterPath)) { 
        page.MasterLocation = MasterPath; 
       } else { 
        if (sc.WIP.CarharttIMD.Common.Config.GetStringValue("Theme") != "Default") 
         page.PreInit += new EventHandler(page_PreInit); 
       } 

       page.ViewData = context.ViewData; 
       page.RenderView(context); 
      } 

void page_PreInit(object sender, EventArgs e) 
      { 
       ViewPage page = sender as ViewPage; 
       //test for Default theme path, and replace with current theme 
       string defaultthemepath = string.Format("{0}Content/Default", page.Request.ApplicationPath); 
       if (!string.IsNullOrEmpty(page.MasterPageFile) && !page.MasterPageFile.ToLower().StartsWith(defaultthemepath.ToLower())) 
       { 
        string masterPagePath = page.MasterPageFile; 
        int lastIndexOfSlash = masterPagePath.LastIndexOf('/'); 
        string masterPageName = masterPagePath.Substring(lastIndexOfSlash + 1, masterPagePath.Length - lastIndexOfSlash - 1); 
        string newMaster = string.Format(
         "~/Content/{0}/Views/Shared/{1}", 
         Common.Config.GetStringValue("Theme"), 
         masterPageName 
        ); 
        if (File.Exists(page.Server.MapPath(newMaster))) 
         page.MasterLocation = newMaster; 
       } 
      } 

只好子类WebViewForm和HANDELING在PreInit事件中的主文件。

1

解决了同样的问题,但方法有点不同。

假设你有不同看法树在主题文件夹中,那么你必须从WebFormViewEngine派生类MyViewEngine设置:

base.MasterLocationFormats = new[] { 
         "~/Theme/Views/{1}/{0}.master", 
         "~/Theme/Views/Shared/{0}.master" 
        } 
       ).ToArray(); 

base.ViewLocationFormats = viewLocationFormats.Concat(
        new[] { 
         "~/Theme/Views/{1}/{0}.aspx", 
         "~/Theme/Views/Shared/{0}.aspx", 
        } 
       ).ToArray() 

和覆盖方法:

protected override bool FileExists(ControllerContext controllerContext, string virtualPath) 
{ 
    return System.IO.File.Exists(controllerContext.HttpContext.Server.MapPath(virtualPath)); 
} 

在来自全球的Application_Start方法。 asax.cs文件加入:

System.Web.Mvc.ViewEngines.Engines.Clear(); 
System.Web.Mvc.ViewEngines.Engines.Add(new WebFormThemeViewEngine()); 
+0

谢谢,但我不能确定这将如何解决我的问题。我认为我不能重写引擎,因为我需要编辑并移动大量文件以进行这些更改。 – 2011-03-29 20:38:17

1

另外,您很可能使用了一些我在这个答案中描述的技术:how to change the themes in asp.net mvc 2

这是对MVC3和剃须刀,但除了查看一切应该只是罚款在MVC 1为好。

+0

谢谢,我为内容文件夹做了非常类似的事情。 – 2011-03-31 15:05:06