我的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);
}
我只是想看看是否有更快的解决方案,因为我非常清楚这会带来任何性能损失,因为这个代码会在site.master文件中的每个页面加载时运行。
答案 0 :(得分:3)
在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等,取决于平台。
答案 1 :(得分:0)
如果您知道文件的完整路径,最快的方法是使用System.IO检查文件是否存在
string curView = @"c:\YourSite\Views\whatever.cshtml";
if (File.Exists(curView))
{
//Continue to view
}
但我认为更好的方法将是你所说的。 您可以将检查与某些缓存存储器结合使用,因此它几乎不会影响运行时。