在 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 等,具体取决于平台。
我的 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 等,具体取决于平台。