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;
}
}
我想知道是否有更好的方法,特别是基本视图引擎做了一堆缓存等我想走哪优势。
有没有人做过类似的事情?
谢谢, 马特