asp.net-mvc에서 Site.Master 파일에서 부분보기가 있는지 확인하는 더 빠른 방법은 무엇입니까?

레오 라

내 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 파일 내부에 주어진 모든 단일 페이지로드에서 실행될 것이라는 점을 감안할 때 이것이 걸릴 성능 저하를 매우 의식하고 있기 때문에 더 빠른 솔루션이 있는지 확인하려고합니다.

Nkosi

최신 정보

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관