다음과 같은 프로젝트 구조가 있습니다.
-
/ Views / Shared / _Layout;
-
/ Areas / Area1 / Views / ControllerName / Index;
…
- / Areas / AreaN / Views / ControllerName / Index.
모든 영역이 _Layout 을 기본 레이아웃 으로 사용하도록 강제하는 방법이 있습니까?
_ViewStart 파일 을 추가하지 않고 수행 할 수있는 방법이 있습니까 (예 : 라우팅 구성을 통해)?
또한보십시오:
답변
다음과 같은 파일을 추가하기 만하면됩니다.
_ViewStart.cshtml
각 영역보기 폴더 아래 :
/Areas/Area1/Views/_ViewStart.cshtml
다음과 같이 루트 레이아웃을 가리 키도록 파일을 편집합니다.
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
이 작업을 수행하기 위해 뷰의 레이아웃 속성에 값을 지정할 필요가 없습니다. 그렇게하면 전역 레이아웃을 재정의하게됩니다.
참고 : Tony가 언급했듯이 루트 레이아웃을 가리 키도록 각 뷰의 레이아웃 속성을 편집 할 수 있지만 뷰를 레이아웃과 결합하고 변경하면 고통 스러울 수 있으므로 권장되는 방법은 아닙니다.
편집 1
코드를 사용하여 기본보기의 레이아웃을 설정하려면 사용자 정의보기 엔진 작성을 고려해야합니다.
사용자 정의 RazorViewEngine
및RazorView
이 기사는 좋은 출발점이 될 수 있습니다.
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”; }
이 모든 것을 한 번에 쉽게 변경하려면. 아마도 그것을 뷰 백 변수로 설정하고 컨트롤러에 전달할 수 있습니다. 더 쉽게 만들기 위해 다른 컨트롤러가 상속하는 기본 컨트롤러를 만들고 레이아웃을 뷰 백에 할당하도록 할 수 있습니다.
라우팅을 변경해야하는 이유가 확실하지 않거나 이해가되지 않습니다. 도움이 되었기를 바랍니다 🙂