문제

사용자 에이전트를 기반으로 모바일 뷰를 제공하기 위해 사용자 정의 뷰 엔진을 구현하려고합니다. 나는 Scott Hanselman의 접근을 따르고 있습니다 이 블로그 게시물.

WebFormsViewEngine에서 상속했으며 Scott이 블로그에서 설명하는 것과 같은 방식으로 FindView 메소드를 재정의했습니다.

그런 다음 Global.asax Application_Start 메서드에 몇 줄을 추가하여 뷰 엔진 수집을 지우고 뷰 엔진의 새로운 인스턴스를 추가했습니다.

일부 테스트 후 MVC가 내 뷰 엔진을 무시하고있는 것으로 보입니다. 브라우저의 사용자 에이전트를 기반으로 내 사용자 지정보기를 찾지 못했을 때, 나는 뷰에 추가하기 위해 사용자 정의 경로를 하드 코딩하는 데 의지했지만 여전히 기본보기로 돌아갈 수있었습니다. FindView 메소드에서 중단 점을 설정하고 충분히 전혀 호출되지 않습니다.

사용자 정의 뷰 엔진이 작동하도록하려면 어떻게해야합니까? 모든 도움은 대단히 감사하겠습니다.

내보기 엔진은 다음과 같습니다.

public class MyViewEngine: WebFormsViewEngine
{
    public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
         ViewEngineResult result = null;

         //Serve a special view for iPhones
         if (UserAgentIs(controllerContext, "iPhone"))
         {
              result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
         }

         //If no special view is found, fall back to the default view
         if (result == null || result.View == null)
         {
              result = base.FindView(controllerContext, viewName, masterName, useCache);
         }

         return result;
    }

    private bool UserAgentIs(ControllerContext controllerContext, string userAgentToTest)
    {
         return (controllerContext.HttpContext.Request.UserAgent.IndexOf(userAgentToTest, StringComparison.OrdinalIgnoreCase) > 0);
    }
}

그리고 내 Global.asax에서 :

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new MyViewEngine());
}

이 설정이 작동하지 않으면 FindView 메소드를 단순화하려고 시도했습니다.

public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
         ViewEngineResult result = null;
         result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
         return result;
    }

그리고 그것은 작동하지 않았습니다. 여전히 기본보기를 반환했습니다. 그렇습니다. 그 진술에서 찾아야 할보기 페이지와 마스터 페이지는 실제로 존재합니다. 나는 이것이 왜 작동하지 않는지에 대해 꽤 혼란스러워합니다.

도움이 되었습니까?

해결책

글쎄, 이것은 확실히 당황 스럽다 :

내보기 엔진을 썼을 때 Scott Hanselman의 블로그 게시물을 따르고있었습니다 (링크의 원래 게시물 참조). 나는 내보기 엔진 클래스를 피한 다음 Scott의 코드를 내 클래스에 복사하여 붙여 넣고 필요에 따라 수정하기로 결정했습니다. 실수로 클래스 정의와 함께 그의 코드를 수업에 복사하여 중첩 클래스를 만들었습니다. 따라서 내 뷰 엔진은 실제로 FindView 메소드에 대한 재정의를 포함하지 않았으며 자연스럽게 중첩 클래스의 방법은 절대로 호출되지 않습니다!

수업 : 온라인으로 찾은 코드를 사용하면 복사하여 붙여 넣지 마십시오! 항상 직접 입력하십시오.

이 질문을 확인하고 나를 도와 주려고 노력한 모든 분들께 감사드립니다.

나는 지금 수치심과 당황의 모퉁이에 서서 갈 것이다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top