_ViewStart.cshtml 레이아웃 파일은 어디에 어떻게 연결되어 있습니까?


199

기본 MVC 3 템플릿의 About.cshtml은 다음과 같습니다.

@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
     Put content here.
</p>

_ViewStart 파일에 대한 참조는에서 찾을 수 About.cshtml있지만 분명히 그렇지 않습니다.

global.asaxand web.config에서 살펴 보았지만 About.cshtml_ViewStart 파일의 레이아웃과 파일이 어떻게 "링크"되어 있는지 확인할 수 없습니다 .

모든 것이 예상대로 작동합니다. 두건에서 무슨 일이 일어나고 있는지 알고 싶습니다 ...

답변:


237

에서 ScottGu의 블로그 :

ASP.NET MVC 3 베타 릴리스부터는 프로젝트의 \ Views 폴더 아래에 _ViewStart.cshtml (또는 VB의 경우 _ViewStart.vbhtml)이라는 파일을 추가 할 수 있습니다.

_ViewStart 파일을 사용하여 각 뷰의 렌더링 시작시 실행할 공통 뷰 코드를 정의 할 수 있습니다. 예를 들어, _ViewStart.cshtml 파일 내에 코드를 작성하여 프로그래밍 방식으로 각보기의 Layout 속성을 기본적으로 SiteLayout.cshtml 파일로 설정할 수 있습니다.

이 코드는 각 View가 시작될 때 실행되므로 더 이상 개별 뷰 파일에서 레이아웃을 명시 적으로 설정할 필요가 없습니다 (위의 기본값을 재정의하려는 경우는 제외).

중요 사항 : _ViewStart.cshtml을 사용하면 코드를 작성할 수 있으므로 선택 사항으로 레이아웃 선택 로직을 기본 특성 세트보다 더 풍부하게 만들 수 있습니다. 예를 들어 사이트에 액세스하는 장치 유형에 따라 사용하는 레이아웃 템플릿을 다양하게 변경할 수 있으며 해당 장치에 대해 전화 또는 태블릿에 최적화 된 레이아웃과 PC / 랩탑에 대한 데스크톱에 최적화 된 레이아웃을 가질 수 있습니다. 또는 여러 고객이 사용하는 CMS 시스템 또는 공통 공유 앱을 구축하는 경우 사이트에 액세스 할 때 고객 (또는 역할)에 따라 사용할 다른 레이아웃을 선택할 수 있습니다.

이것은 많은 UI 유연성을 가능하게합니다. 또한 뷰 로직을 한 번 더 쉽게 작성하고 여러 위치에서 반복하지 않아도됩니다.

이것도 참조 하십시오 .


14
MVC3의 "하드 코딩 된"기능입니까? 다른 "기본"페이지로 변경할 필요가 없으며 설정 방법이 궁금합니다. 모든 것을
정리해

2
Kman- 하드 코딩, 관례에 따라 (여기에서 '핸들'을 선택하십시오 :))-그렇습니다. 이 안개 삭제 기쁜
짐 tollan의

"Views"폴더에만있는 것이 아니라 필요할 수도 있습니다. 다른 폴더로보기를 구성하기 위해 사용자 정의 RazorViewEngine을 추가하는 경우 해당 대체보기 폴더의 루트에도 파일을 포함시켜야합니다. 예를 들어, 모든 Inspinia 템플릿보기를 폴더로 옮기고보기 엔진에서 실행했습니다 ViewLocationFormats = ViewLocationFormats.Union(new string[] { "~/Inspinia/ExampleViews/{1}/{0}.cshtml" }).ToArray();. 결과적으로 _ViewStart.cshtml 파일의 사본을 "~ / Inspinia / ExampleViews"에 추가해야했습니다. 그렇지 않으면 파일이 선택되지 않고 레이아웃이 설정되지 않은 것입니다.
Triynko

2
Views 폴더에 하위 폴더가있는 경우 _ViewStart각 하위 폴더에 해당 하위 폴더의보기에 연결할 링크를 넣을 수 있습니까?
toddmo

35

보다 일반적인 의미에서 _Viewstart.cshtml에 대해 "알기"위한 MVC 프레임 워크의이 기능을 "코딩 별 규칙"이라고합니다.

컨벤션에 대한 컨벤션 (컨벤션에 의한 코딩이라고도 함)은 개발자가 내려야하는 결정의 수를 줄여서 단순성을 얻지 만 반드시 유연성을 잃지는 않는 소프트웨어 디자인 패러다임입니다. 이 문구는 본질적으로 개발자가 응용 프로그램의 비 전통적인 측면 만 지정하면됨을 의미합니다. 예를 들어, 모델에 Sale 클래스가있는 경우 데이터베이스의 해당 테이블을 기본적으로 "판매"라고합니다. “products_sold”테이블을 호출하는 것과 같이이 규칙을 벗어나는 경우에만 이러한 이름과 관련된 코드를 작성해야합니다.

위키 백과

그것에 마법이 없습니다. MVC 프레임 워크의 핵심 코드베이스에 작성되었으므로 MVC가 "알고있는"것입니다. .config 파일이나 다른 곳에서 찾을 수없는 이유는 무엇입니까? 실제로 MVC 코드에 있습니다. 그러나 이러한 규칙을 변경하거나 무시하도록 재정의 할 수 있습니다.


13
MVC가 그것에 대해 알고 있다면 왜 Visual Studio가 이것을 알고 나에게 지적하지 않습니까? 컨벤션에 의한 코딩이 컨벤션을 어 기지 않는 한 물건이 작동한다는 것을 의미한다면, 그것은 일종의 짜증이납니다.
Arne Evertsson

관습을 어 기지 않는 것이 요점입니다. AKAIK Ruby on Rails도이 패러다임을 따릅니다.
우마르 파 루크 카와 자

Raif +1 잘못 기록 된 "협약에 의한 코딩"을 방어 할 필요는 없다. 나는 이전 코드에 대해 말할 수 있었다. "뭐? 당신은 33에 도착했을 때 충돌이 예상되지 않았습니까? 모두가 당신이 33을 건너 뛰는 것을 알고 있습니다." 불행히도 ASP.NET MVC의 설명서 간격은 엄청납니다. 내부 소스 요약없이 MS 문서 만 자동 생성됩니다.
shannon

6
컨벤션에 대한 컨벤션은 변경할 수 없다는 의미는 아닙니다. 해당 파일의 이름과 위치를 지정할 수있는 구성이 있어야합니다. 잘 있을지 모르지만 누가 무엇인지 알고 있습니다. 사람들은 "컨벤션에 대한 컨벤션"만트라를 사용하여 코드베이스에서 여러 가지 잘못된 결정을 내릴 수있게되었고, 문서화 된 엉망인 "그냥 작동"을 유지하기 위해 사후 사실을 따르는 사람으로 나를 화나게했습니다. 신은 당신이 무엇이든 바꾸는 것을 금지했다-당신은 어떻게 모든 것을 깨뜨 렸는지 알아내는 데 몇 시간을 소비 할 것이다).
Robert C. Barth

3
@AidenStrydom 동의하지 않습니다. 수락 된 답변은 실제로 _ViewStart 사용법을 알려줍니다. 이 답변은 설계 개념에 대해서만 이야기합니다. Visual Studio가 _ViewStart에 대해 아무 것도 알려주지 않는 이유에 대한 정보가 아니라 _ViewStart에 대한 정보를 얻기 위해 여기에 왔습니다.
Millie Smith

23

또 다른 생각.

자신의 cshtml파일을 공통 템플릿으로 사용하려면 다음과 같이 하십시오.

_viewstart.cshtml당신 안에 당신 의 공통 cshtml파일을 언급 할 수 있습니다.

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

14

소스 코드는 문서보다 이것을 찾는 것이 훨씬 낫습니다.

Github 의 MVC 6 코드 를 참조하면 몇 가지 중요한 파일이 있습니다.

----최신 정보----

소스 구조 변경으로 인해 이제 RazorViewEngine.cs 에서 "startViewPages"기능을 찾는 viewstart 페이지를 수집하는 방법에 대한 정보를 찾을 수 있습니다 .

----/최신 정보----

그들이 어떻게 작동하는지 대답하려면 RazorView를 살펴보십시오 .IView 때문에 MVC 파이프 라인에 묶여 있다고 생각합니다. 이 파일에는 요청 된보기를 렌더링하기 위해 MVC 파이프 라인에서 호출되는 RenderAsync 메소드가 있습니다.

RenderAsync는 RenderPage AND THEN RenderLayout (주문 없음)을 호출합니다. RenderPage는 먼저 viewstart 파일을 처리하기 위해 호출합니다 (여러 개, _viewstart 파일이 두 개 이상있을 수 있음).

따라서 원하는 정보 는 Microsoft.AspNet.Mvc.Razor 네임 스페이스의 RazorView.cs 파일에 있는 RenderViewStartAsync 함수에서 얻을 수 있습니다 .


7

이것은이 질문에 추가 정보를 추가 할 수 있습니다 (2016 ala MVC4, MVC5).

면도기 엔진 발견과의 코드 실행 _ViewStart.cshtml 하여 같은 디렉토리 또는 하위 디렉토리에있는 다른 코드 앞에 _ViewStart.cshtml가 발견됩니다.

모든 뷰는 Layout 속성 또는 해당 값을 재정의 할 수 있습니다 .

_ViewStart 이유를 보여주기 위해 조금 더 많은 정보를 추가 할 수 있다고 생각했습니다.

ILSpy 를 받고 RazorViewEngine (System.Web.Mvc.dll)의 코드를 검사하면 코드 자체가 해당 이름을 참조한다는 것을 알 수 있습니다.

System.Web.Mvc.dll의 _ViewStart

RazorViewEngine은 해당 이름의 파일을 찾습니다.

razorviewengine 코드

RazorViewEngine.ViewStartFileName = "_ViewStart";

3
이것은 내가 찾고있는 것입니다. 나는 프로젝트에서 진행중인 일을 "알지 못합니다"를 싫어합니다. VS 용 자체 템플릿을 사용하고 있기 때문에 공중에서 나온 파일은 이해하기가 매우
어렵습니다.

1

페이지의 공통 레이아웃을 원한다면 공통 레이아웃을 정의하고 뷰를 레이아웃과 연결해야합니다. 각 뷰마다 레이아웃 속성을 설정해야합니다. 이것은 DRY (Do n't Repeat Yourself) 원칙을 위반합니다. 이를 위해 .Net Framework는 "_ViewStart.cshtml"파일을보기 폴더 안에 제공합니다. 레이아웃 정보를 "_ViewStart.cshtml"파일에 배치하고 기본적으로 모든 뷰는이 레이아웃 정보를 사용합니다. 다른 레이아웃 정보를 제공하려면 홈보기를 가정하고 해당 레이아웃을 참조하여 새 "_ViewStart.cshtml"을 만들어 "홈보기"폴더에 배치 할 수 있습니다.


1

짧은 대답은 다음과 같습니다. View가 뷰가 렌더링 될 때 먼저 시작됩니다. 긴 이야기는 다음과 같습니다.

단일 뷰 파일 작성에 대한 이야기 ​​:

  1. ViewStart는 ViewImports와 병합 된 다음 단일 파일로 실행됩니다. ViewImports는 항상 ViewStart 파일을 포함한 모든 cshtml 파일과 병합됩니다. @using 문과 기타 일반적인 지시문을 추상화하는 것이 목적입니다.
  2. 특정 View 파일에서 ViewStart 출력 (예 : Layout 및 ViewData)을 사용할 수 있습니다.
  3. View 파일 내에서 Layout 변수가 null이되면 뷰의 본문이 렌더링되고 최종 출력이 사용자에게 전달됩니다.
  4. Layout 변수가 null이 아니거나 실행되지 않으면 실행이 레이아웃 파일로 이동되고 ViewImports와 단일 파일로 병합 된 다음 레이아웃 파일 내의 @RenderBody () 문에서 실행이 뷰 파일로 다시 이동됩니다. 이는 ViewImports와 다시 병합되고 출력은 @RenderBody () 위치의 레이아웃 파일과 병합되고 최종 출력은 최종적으로 사용자에게 전달됩니다.

프로그램 라이프 사이클의 알려지지 않은 미스터리에서 실제로 무슨 일이 일어나고 있는지 알 수 있기를 바랍니다.

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