【问题标题】:Overriding view location for Razor View EngineRazor View Engine 的覆盖视图位置
【发布时间】:2012-03-23 21:27:08
【问题描述】:

我更喜欢在我的 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;
    }
}

我想知道是否有更好的方法,特别是基本视图引擎会执行大量缓存等,我想利用这些方法。

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

谢谢, 马特

【问题讨论】:

    标签: asp.net-mvc razor viewengine


    【解决方案1】:

    查看ViewLocationCache 以添加一些缓存。

    这里使用起来非常简单,是我的 FindView 中的一个 sn-p:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 2018-02-24
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      相关资源
      最近更新 更多