내 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 파일 내부에 주어진 모든 단일 페이지로드에서 실행될 것이라는 점을 감안할 때 이것이 걸릴 성능 저하를 매우 의식하고 있기 때문에 더 빠른 솔루션이 있는지 확인하려고합니다.
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 등.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다