替代Razor视图引擎的视图位置



我更喜欢在MVC应用程序中每个控制器操作一个类,但我希望能够用每个"控制器"一个文件夹来构建我的视图文件夹。

我使用像/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;
    }
}

我想知道是否有更好的方法,特别是,基本视图引擎做了一堆缓存等,我想利用它们。

有人做过类似的事情吗?

谢谢,Matt

查看ViewLocationCache以添加一些缓存。

使用起来很简单,这是我的FindView:中的一个片段

        string cacheKey = CreateCacheKey(name, areaName, cacheKeyPrefix, specificPath, controllerName, skin, deviceManufacturerName, deviceName);
        if (useCache)
        {
            return ViewLocationCache.GetViewLocation(controllerContext.HttpContext, cacheKey);
        }

相关内容

  • 没有找到相关文章

最新更新