2017-03-22 11 views
0

예를 들어 설명한 것처럼 ASP.NET MVC 응용 프로그램에서 장치 관련보기를 구현하려고합니다. 여기 : https://www.simple-talk.com/dotnet/asp-net/multiple-views-and-displaymode-providers-in-asp-net-mvc-4/ 또는 여기 : https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/aspnet-mvc-4-mobile-features컨트롤러 동작에 뷰 경로가 포함되어있을 때 DisplayMode가 모바일보기로 변경되지 않습니다.

위 ASP.NET MVC4에 맞도록하는 기사가, 그 내용은 프레임 워크의 이후 버전에 대한 관련 (내 애플 리케이션 ASP.NET MVC 5.2을 사용하고 있습니다)하지만.

문제가 발생했습니다.

public class TestController: Controller 
{ 
    public ActionResult Test() 
    { 
     return View(new TestModel()); 
    } 
    public ActionResult Test2() 
    { 
     return View("~/Views/Test/Test.cshtml", new TestModel()); 
    } 
} 

테스트 모델은 정말 기본입니다 : 나는 다음과 같은 컨트롤러가

public class TestModel 
{ 
    public string TheDate 
    { 
     get 
     { 
      return DateTime.Now.ToString(); 
     } 
    } 
} 

을 그리고 나는 "/ 테스트 ~/조회"폴더에 두 개의 전망이 :

Test.cshtml

@model MyNamespace.Models.TestModel 
<!DOCTYPE html> 
<html> 
<head><title></title></head> 
<body> 
<h1>This is the desktop view</h1> 
<p>model data: @Model.TheDate</p> 
</body> 
</html> 

Test.Mobile.cshtml

,
@model MyNamespace.Models.TestModel 
<!DOCTYPE html> 
<html> 
<head><title></title></head> 
<body> 
<h1>This is the mobile view</h1> 
<p>model data: @Model.TheDate</p> 
</body> 
</html> 

위의 링크에서 설명한 해결책을 구현했습니다.

/test/test를 묻는 메시지가 표시되면 데스크탑 뷰어에서 요청할 때 Test.cshtml을, 모바일 에뮬레이터에서 요청할 때는 Test.Mobile.cshtml을 볼 수 있습니다. 그러나/test/test2를 요청할 때마다 데스크탑보기가 항상 표시됩니다.

내 문제에 대한 해결책을 찾았지만 모든 사람이 동일한 시나리오 (예 : "/ test/test"시나리오)를 반복적으로 재현하는 것으로 보이며 아무도 "/ test/test2 "시나리오. 해당 기능을 재정의 할 수 있습니까? 기본 면도기/MVC 기능을 무시하고 손을 더럽힐 까봐 두려워하지 않지만 어디서부터 시작해야할지 정말 모르겠습니다.

도움을 주시면 감사하겠습니다.

답변

1

나는이 기능을 오버라이드 (override)에 대해 잘 모르겠지만, 당신은 사용자 정의 RazorViewEngine에게 클래스를 사용하고 FindView 메소드를 오버라이드 (override)하고,이 같은 해결 방법으로 Request.Browser.IsMobileDevice를 사용하여 모바일 장치를 검색 할 수 있습니다

public class CustomViewEngine : RazorViewEngine 
{ 
     public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
     { 
      var viewPath = controllerContext.HttpContext.Request.Browser.IsMobileDevice ? "MobilePath" : "defaultPath"; 

      return base.FindView(controllerContext, viewPath, "MasterName", useCache); 
     } 
} 

는 다음과 같이 에 위해 Application_Start을 사용자 정의보기 엔진을 등록하는 것을 잊지 마세요 :

ViewEngines.Engines.Clear(); 
ViewEngines.Engines.Add(new CustomViewEngine()) 
+0

컨트롤러의 코드베이스에 손을 대지 않기를 바랬습니다. 또한, DisplayMode 솔루션만큼 일반적이지는 않습니다. "태블릿"모드, "LegacyPhone"모드 등을 사용하려면 어떻게해야합니까? 이러한 유형의 작업에 대한 return 문은 매우 귀찮은 일입니다. – Yiangos

+0

보다 일반적인 솔루션으로 base.FindView 메서드를 사용하여 RazorViewEngine 클래스를 상속하고 특정 뷰에 대해 원하는 경로를 설정하여 사용자 지정 뷰 엔진을 만들 수 있습니다. 이렇게하면 모든 장치 검사가 한 곳에서 이루어집니다. –

+0

그 중 하나는 적절하지 않습니다. 내 문제는 반환 된 View 개체에 이미 생성자 인수에 선언 된 뷰 경로가있는 경우입니다. 이 경우 FindView 메서드가 호출되지 않는다는 것을 이해할 수 있습니다. 엔진은 이미 뷰를 검색 할 위치를 알고 있습니다.그러나 내가 전화를 받았는지 확인하려고 노력할 것입니다. 만약 그렇다면, 거기에 장치 탐지 로직을 심어 놓을 것입니다. 나는 결과에 대해 알려줄 것이지만, 나는 지금 약간 비관적이다. – Yiangos