0

한 번에 99 %의 기준으로 고급 사이트를 만들고 있습니다. ~/Views/Shared/UniversalView.cshtml을 보편적 인보기에 해당하는보기가없는 모든 컨트롤러 동작을 가리키는 책임이있는 다음 코드를 작성했습니다.지정된보기없이 모든 작업을 하나의 구체적인보기로 지정

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 

    foreach (IViewEngine engine in ViewEngines.Engines) 
    { 
     if (engine is RazorViewEngine) 
     { 
      RazorViewEngine razorEngine = (RazorViewEngine)engine; 
      var locationFormats = razorEngine.ViewLocationFormats; 
      List<string> l = new List<string>(locationFormats); 
      l.Add("~/Views/Shared/UniversalView.cshtml"); 
      razorEngine.ViewLocationFormats = l.ToArray(); 
     } 
    } 
} 

나는 그 효과를 달성하는 훨씬 더 좋은 방법이 될 것을 확신한다. 어떤 아이디어?

답변

2

BaseController를 선언 할 수 있으며 모든 컨트롤러가이 컨트롤러에서 상속해야합니다.

그런 다음 당신이이 방법 대신에 기존의보기를 호출 할 수 있습니다 다른 컨트롤러에서

public ViewResult UniversalView(string viewName="UniversalView") 
    { 
     return View(viewName); 
    } 

같은 BaseController에 메소드를 추가(). 보기 이름을 지정하면 해당보기가 사용되며 그렇지 않은 경우 기본보기는 기본값입니다.

public ActionResult About() 
    { 
     return UniversalView(); 
    } 
+0

답변 해 주셔서 감사합니다. 전에는 그 솔루션을 고려하고 있었지만, 한 가지 차이점을 감안할 때 컨트롤러 클래스를 상속하고 View 메서드를 재정의 할 생각을하고 컨트롤러 복잡성의 원인이 두렵게되었습니다. IMHO는 좋은 해결책이지만 프로그래머가 사용자 지정 컨트롤러 클래스에서 파생 된 것을 기억해야하므로 결과를 유지하기가 어려울 수 있습니다. – MaciejLisCK

0

난 그냥 모든 관련 행위에 해당 뷰 사용합니다 :

... 
return View("UniversalView"); 

을하지만 당신은 정말 당신의 방법을 이동합니다. ExecuteResult 메서드 link을보고 원하는 것을 얻으려면이 메서드를 사용하십시오.

+0

답변 해 주셔서 감사합니다. 거의 모든 작업에서 View ("~/Views/Shared/UniversalView.cshtml")를 반환해야하기 때문에이 솔루션은 유지하기가 매우 어려울 것입니다. – MaciejLisCK