[asp.net-mvc] 모든 영역이 동일한 레이아웃을 사용하도록 강제

다음과 같은 프로젝트 구조가 있습니다.

  • / Views / Shared / _Layout;

  • / Areas / Area1 / Views / ControllerName / Index;

  • / Areas / AreaN / Views / ControllerName / Index.

모든 영역이 _Layout기본 레이아웃 으로 사용하도록 강제하는 방법이 있습니까?

_ViewStart 파일 을 추가하지 않고 수행 할 수있는 방법이 있습니까 (예 : 라우팅 구성을 통해)?

또한보십시오:

ASP.NET MVC 3 razor ViewStart 파일에서 다른 레이아웃을 어떻게 지정합니까?



답변

다음과 같은 파일을 추가하기 만하면됩니다.

_ViewStart.cshtml

각 영역보기 폴더 아래 :

/Areas/Area1/Views/_ViewStart.cshtml

다음과 같이 루트 레이아웃을 가리 키도록 파일을 편집합니다.

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

이 작업을 수행하기 위해 뷰의 레이아웃 속성에 값을 지정할 필요가 없습니다. 그렇게하면 전역 레이아웃을 재정의하게됩니다.

참고 : Tony가 언급했듯이 루트 레이아웃을 가리 키도록 각 뷰의 레이아웃 속성을 편집 할 있지만 뷰를 레이아웃과 결합하고 변경하면 고통 스러울 수 있으므로 권장되는 방법은 아닙니다.

편집 1

코드를 사용하여 기본보기의 레이아웃을 설정하려면 사용자 정의보기 엔진 작성을 고려해야합니다.

사용자 정의 RazorViewEngineRazorView

이 기사는 좋은 출발점이 될 수 있습니다.

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

이런 짓은 안했는데 올바른 방향으로 가리 키길 바래요


답변

Jupaol의 답변을 확장합니다 ….

적어도 VS2013에서는 영역을 만들 때 기본적으로 _ViewStart.cshtml 파일이 추가되므로 이미 거기에 있으며 루트 _Layout.cshtml을 가리 키도록 내용을 변경할 수 있습니다. 그런 다음 해당 영역에서 _Layout.cshtml을 제거 할 수 있습니다. 더 이상 사용되지 않기 때문입니다 (현재 혼란의 원인이 될 수 있음).

그러나 루트 _Layout.cshtml에서 수행되는 라우팅을 수행하면 영역을 고려해야합니다.
기본 _Layout.cshtml에는 약간의 수정이 필요한 여러 ActionLink 도우미가 있습니다.

Area = “”를 설정하여 모든 ActionLink 호출에 RouteValueDictionary 매개 변수를 추가합니다. 빈 문자열은 루트 수준을 나타냅니다. 이렇게하면 이러한 링크가 영역 내에서 호출 될 때 올바르게 작동하고 루트에서 호출 될 때 계속 작동합니다.

예 :

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>


답변

다음을 사용하여 레이아웃을 지정합니다.

@ {레이아웃 = “_Layout”; }

이 모든 것을 한 번에 쉽게 변경하려면. 아마도 그것을 뷰 백 변수로 설정하고 컨트롤러에 전달할 수 있습니다. 더 쉽게 만들기 위해 다른 컨트롤러가 상속하는 기본 컨트롤러를 만들고 레이아웃을 뷰 백에 할당하도록 할 수 있습니다.

라우팅을 변경해야하는 이유가 확실하지 않거나 이해가되지 않습니다. 도움이 되었기를 바랍니다 🙂


답변