모든 영역이 동일한 레이아웃을 사용하도록 강제


88

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

  • / Views / Shared / _Layout;

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

...

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

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

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

또한보십시오:

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


답변:


156

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

_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

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


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

2
라우팅 내에서는 그렇게 생각하지 않습니다. 그들은 두 가지 다른 것입니다. 라우팅은 현재 요청 URL을 RoutesTable에 등록 된 라우트와 일치시키는 것을 담당하며, 일치가 발견되면 IMvcRouteHandler가 생성되고 IHttpHandler (MvcHandler)가 컨트롤러의 동작을 처리합니다. 보시다시피, 이것은 뷰나 레이아웃과 관련이 없습니다. 라우트가 뷰를 반환 할 필요가 없기 때문에 json 또는 xml을 반환 할 수 있습니다. 따라서 라우팅은 이와 같은 구현을위한 올바른 장소가 아닙니다.
Jupaol 2012

또한 _ViewStartArea 폴더에 직접 추가하여 모든 영역에 적용 할 수도 있습니다.
Artur

21

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>

2

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

@ {레이아웃 = "_Layout"; }

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.