在 asp.net-mvc 中,检查 Site.Master 文件中是否存在部分视图的更快方法是什么?

In asp.net-mvc what is the faster way to check if a partial view exists from Site.Master file?

我的 Site.Master 文件中的代码如下所示:

<% var menuName = StaticHelper.GetSiteMenuName(); %>
<%Html.RenderPartial("Menu" + menuName .ToUpper()); %>

因此,如果您的菜单名称是 "NewYork",它将查找名为 "MenuNewYork" 的部分视图。

这很好用,但在某些情况下,现在我没有菜单设置,所以我想让它默认为默认菜单。我想要这样的东西:

<% var menuName = StaticHelper.GetSiteMenuName(); %>
<% if (PartialViewExists("Menu" + menuName) { %>
      <%Html.RenderPartial("Menu" + menuName .ToUpper()); %>
<% }else { %>
      <%Html.RenderPartial("MenuDEFAULT"); %>
<% } %>

更新

我在这里找到了解决方案

public static bool DoesPartialViewExist(this HtmlHelper html, string partialViewName)
{
    var controllerContext = html.ViewContext.Controller.ControllerContext;
    ViewEngineResult result = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName);
    return (result.View != null);
}

我只是想看看是否有更快的解决方案,因为我非常清楚如果此代码在 [=30] 内的每个页面加载中都会 运行 ,这会带来任何性能损失=] 文件.

如果您知道文件的完整路径,最快的方法是使用 System.IO

检查文件是否存在
string curView = @"c:\YourSite\Views\whatever.cshtml";
if (File.Exists(curView))
{
  //Continue to view
}

但我认为更好的方法将是你所说的。 您可以将检查与一些缓存存储结合起来,这样它对运行时几乎没有影响。

更新

在 Githup 上查看 MVC 的源代码后,内部已经在缓存获取视图和部分视图时找到的路径,这将使我最初的建议过早优化。

这意味着您找到并引用的答案...

public static bool DoesPartialViewExist(this HtmlHelper html, string partialViewName) {
    var controllerContext = html.ViewContext.Controller.ControllerContext;
    var viewEngineResult = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName);
    return (viewEngineResult.View != null);
}

已经优化。


原创

您可以缓存该值以供将来查找,以尝试提高多个请求的性能。

static IDictionary<string, bool> partialViewCache = new Dictionary<string, bool>();
public static bool DoesPartialViewExist(this HtmlHelper html, string partialViewName) {
    bool value = false;
    if (partialViewCache.TryGetValue(partialViewName, out value)) {
        var controllerContext = html.ViewContext.Controller.ControllerContext;
        ViewEngineResult result = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName);
        value = result.View != null;
        partialViewCache[partialViewName] = value;
    }
    return value;
}

在上面,静态字段用于保存值,但该方法可以很容易地使用另一种缓存机制。即 MemeoryCache、IMemoryCache 等,具体取决于平台。