ASP.NET MVC 사용자 지정보기 엔진이 호출되지 않습니다
-
06-07-2019 - |
문제
사용자 에이전트를 기반으로 모바일 뷰를 제공하기 위해 사용자 정의 뷰 엔진을 구현하려고합니다. 나는 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 메소드에 대한 재정의를 포함하지 않았으며 자연스럽게 중첩 클래스의 방법은 절대로 호출되지 않습니다!
수업 : 온라인으로 찾은 코드를 사용하면 복사하여 붙여 넣지 마십시오! 항상 직접 입력하십시오.
이 질문을 확인하고 나를 도와 주려고 노력한 모든 분들께 감사드립니다.
나는 지금 수치심과 당황의 모퉁이에 서서 갈 것이다!