2012-03-23 10 views
1

私はMVCアプリケーションで1つのコントローラアクションごとに作業することを好みますが、「コントローラ」ごとに1つのフォルダでビューフォルダを構造化できるはずです。Razor View Engineの表示位置を無効にする

AdminLoginControllerおよび/ Admin/Indexという名前のAdminIndexControllerにマップされるクラスにマップされる/ Admin/Loginのようなルートを使用します。しかし、私は、私は1つのフォルダをAdminと呼ばれるように私のビューフォルダを構造化したいと思うし、2つのファイル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); 
     }