2012-03-23 63 views
1

我更喜欢在我的MVC应用程序中使用每个控制器动作的一个类,但是我希望能够为每个“控制器”的一个文件夹构建我的视图文件夹。Razor视图引擎的首选视图位置

我使用像/ Admin/Login这样的路线映射到名为AdminLoginController和/ Admin/Index的类,该类将映射到AdminIndexController。但是,我想构建我的视图文件夹,以便我有一个名为Admin的文件夹,然后是两个名为login.cshtml和index.cshtml的文件。

要做到这一点,它看起来像我需要重写ViewEngine。我知道了用下面的代码工作:

public class MyViewEngine : RazorViewEngine 
{ 
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     var controllerTypeName = controllerContext.RouteData.GetRequiredString("controller"); 
     var controllerParts =_GetControllerNameParts(controllerTypeName); 
     var folderName = controllerParts.Take(controllerParts.Length - 1).Aggregate((s1, s2) => s1 + s2); 
     viewName = controllerParts[controllerParts.Length - 1]; 
     var filename = _GetFilename(folderName, viewName, controllerContext); 

     return new ViewEngineResult(CreateView(controllerContext, filename, masterName), this); 
    } 

    private string[] _GetControllerNameParts(string controllerTypeName) 
    { 
     var r = new Regex(@" 
      (?<=[A-Z])(?=[A-Z][a-z]) | 
      (?<=[^A-Z])(?=[A-Z]) | 
      (?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace); 
     return r.Split(controllerTypeName); 
    } 

    private string _GetFilename(string folderName, string viewName, ControllerContext controllerContext) 
    { 
     var path = string.Format("~/Views/{0}/{1}.cshtml", folderName, viewName); 
     var filename = controllerContext.HttpContext.Server.MapPath(path); 
     if (File.Exists(filename)) { return path; } 
     return null; 
    } 
} 

我想知道是否有更好的方法,特别是基本视图引擎做了一堆缓存等我想走哪优势。

有没有人做过类似的事情?

谢谢, 马特

回答

0

看一看在ViewLocationCache添加一些缓存。

它用在这里很简单,就是从我FindView片段:

 string cacheKey = CreateCacheKey(name, areaName, cacheKeyPrefix, specificPath, controllerName, skin, deviceManufacturerName, deviceName); 

     if (useCache) 
     { 
      return ViewLocationCache.GetViewLocation(controllerContext.HttpContext, cacheKey); 
     }