왜 Razor _layout.cshtml에 파일 이름에 밑줄이 있습니까?


144

기본 ASP.NET MVC 3 프로젝트에서 레이아웃 및 부분 cshtml 파일은 밑줄로 시작합니다

  • _viewstart
  • _Layout
  • _LogOnPartial

이 관습이 왜 필요한가? 이 컨벤션을 따라야합니까?

프레임 워크 .cshtml가 밑줄로 시작 하는 파일에 특별한 의미를 부여합니까 ?


나는 Razor와 함께 NancyFX를 사용하며 기본적으로 Content 폴더에없는 모든 컨텐츠를 제한합니다. (web.config 또는 사용자 정의 구성에서 재정의 할 수 있음) .cshtml과 같은 파일을 직접 제공하는 것은 불가능합니다. 따라서 뷰 이름 앞에 "_"를 붙인 것은 필요하지 않으며 추악하지 않기 때문입니다.
Norbert Norbertson

답변:


205

Razor는 ASP.NET 웹 페이지 (WebMatrix)를 위해 개발되었으며, MVC에서 얻을 수있는보기 폴더 및 라우팅과 같은 종류의 보호 기능이 없습니다. 웹 페이지의 레이아웃 페이지는 직접 제공되지 않으므로 밑줄이 앞에 붙습니다. 또한 웹 페이지 프레임 워크는 이름에 밑줄이있는 파일이 직접 요청되지 않도록 구성되었습니다. 웹 페이지 내의 다른 .cshtml 파일은 일반적으로 찾아 볼 수 있어야합니다. .asp 또는 .php 파일과 동일합니다.

ASP.NET 팀은 Web Pages가 ASP.NET 개발의 출발점이라고 말하면서 MVC 로의 마이그레이션을 제 시간에 맞춰야합니다. 그 중 일부는 웹 페이지에서 MVC로 마이그레이션하는 것이 쉬워야한다는 것을 의미합니다. 결과적으로 웹 페이지 내에 설정된 이름 지정 규칙을 MVC Razor 파일로 전달하는 것이 좋습니다.

그래서이 있다 밑줄로 파일 이름을 접두어에 대한 기술적 인 이유는 - 그것은 단지 MVC와 관련이 없습니다.

[업데이트 2018 년 10 월]

새로운 ASP.NET Core Razor Pages 프레임 워크 (버전 2.1 제외)에서 시작시에 밑줄이있는 파일은 @page지시문 이있는 경우에도 경로가 생성 될 때 무시됩니다 (일반적으로 라우팅 가능한 Razor 페이지가 됨) . 그렇기 때문에 Razor Pages 응용 프로그램에서 레이아웃과 부분 파일의 이름을 밑줄로 표시하는 것이 좋습니다.


6
감사. 나에게 이것은 가장 통찰력있는 대답입니다. 나는 면도기가 MVC에 묶여 있다는 오해를 받고 있었다. 이제 주요 밑줄이 ASP.NET 웹 페이지에서 직접 제공되지 않도록하기위한 이유가 있습니다.
rich

1
실제로는 기능이 결합 된 명명 규칙 인 MS가 더 잘 알고 있다고 생각했습니다. 그리고 이제는 MVC로 옮겨졌습니다. MVC는 깨끗한 슬레이트였습니다.
보리스 B.

"One ASP.NET"기능을 포함하여 현재 .NET Framework 4.5.1 및 Visual Studio 2013 릴리스 이후에는 이러한 기술적 제한 / 하드 코딩에서 벗어날 수 있기를 바랍니다. 물론 현재 * .config, APP_Code 및 APP_Data 디렉토리와 같이 표준 파일을 공유하지 않는 것이 필수적입니다. 그러나이 로직은 구성 파일을 어딘가에 설정해야하며 (시스템 설정은 기본값) 재정의 할 수 있습니다. 또한 공통 페이지의 이러한 기본 이름을 구성 할 수 있어야합니다 (레이아웃 / 오류 / 등 ...).
Tony Wall

1
@Daniel 오, 무슨 말인지 알 겠어. 광고 된대로 작동하지 않기 때문에 답변을 편집했습니다.
Mike Brind

1
@Daniel 당신이보고있는 것은 분명히 Razor Pages 2.1에 나타난 버그입니다. 2.2에서 수정 될 예정입니다. 2.0에서 설명한대로 작동합니다.
Mike Brind

12

이것이 Ruby on Rails가하는 방식입니다 (부분은 _로 시작하지만 렌더 부분 호출에는 _이 포함되지 않음). ASP.net MVC는 그로부터 많은 영감을 얻었습니다.

기술적 인 이유는 없습니다. 단지 6 개월 후에 다른 개발자들에게 자신의 의도를 명확하게 보여주기위한 협약 일뿐입니다. 이것은 부분적인 견해입니다.


위의 답변에서 지적했듯이 이것은 잘못된 것입니다. 밑줄에는 보안 기능이 있습니다.
iJungleBoy

1
@iJungleBoy 허용되는 답변보기. ASP.net MVC (이 질문에 관한 것)에는 보안 기능이 없습니다. 모든 cshtml 및 aspx 파일을 밑줄로 표시하거나 설정하지 않고 이미 차단 한 Views 폴더의 web.config를 참조하십시오 System.Web.HttpNotFoundHandler.
Michael Stum

7

브라우저의 직접 요청으로 표시 할 수없는 페이지 (마스터 페이지, 부분보기 등)는 이름 앞에 밑줄 (_)이 있습니다.

따라서 _Layout.cshtml (이것은 마스터 페이지 임)에 요청하려고하면 서버에서 오류가 발생합니다.

Razor보기 엔진에서 독립형 페이지로 탐색 할 수없는 파일을 구별하는 방법입니다.

MVC 2에서는이 방법을 생각해보십시오 ... 부분보기와 마스터 사이트를 접미사 .master, .ascx로 구별하고 일반 페이지는 .aspx입니다. 반면 Razor보기에서는 ... 모든 뷰는 .cshtml이므로 부분 페이지와 마스터 페이지를 구분하기 위해 접두사 (_)를 갖습니다. 필수는 아니며 "컨벤션"입니다.


4
그러나 그 논리에 의해 모든 cs & cshtml 파일이 밑줄로 시작되는 것은 아닙니다.
rich1

모든 파일에 접두사가 _ 인 경우 사이트가 작동하지 않습니다. _prefix가있는 파일은 일반 페이지 내에서 렌더링됩니다 (일부 항목의 경우). 그리고 사이트 마스터는 템플릿입니다. 표시됩니다.
Juztin

방금 시도한 결과 내 상자의 IIS는 Views 디렉토리의 파일을 제공하지 않습니다. 정적 .html 파일조차도 아닙니다. 그래서 나는 이것이 이것이 정답이라고 생각하지 않습니다.
rich1

Juztin : 질문은 왜 밑줄로 시작합니까? _Layout.cshtm의 이름을 Layout.cshtml로 바꾸면 여전히 잘 작동합니다. 그렇다면이 협약의 이유는 무엇입니까?
rich1

2
질문은하지 웹 페이지, asp.net MVC에 관한 것입니다
fabspro

2

내가 아는 한 이것은 단순히 파일의 의도를 식별하는 데 사용되는 규칙입니다. 나는 그것이 실제로 파일의 행동을 바꿀 것이라고 믿지 않는다. 대부분의 개발 컨텍스트에서 밑줄을 추가하면 클래스 또는이 경우 다른 템플릿에 의해 "개인"사용을위한 대상이 식별됩니다.


1

MVC를 사용하지는 않지만 면도기 구문을 사용하는 웹 페이지에서는 _ 접두사가 일반적으로 사용자가 페이지를 액세스하지 않고 다른 페이지 또는 일부 코드로 페이지에 액세스하도록되어 있습니다. _prefix가 포함 된 페이지로 이동하려고하면 asp.net이 해당 페이지에 액세스하지 못하게합니다. 그렇기 때문에 사용자가 직접 레이아웃 페이지와 다른 페이지에 액세스해서는 안되기 때문에 레이아웃 페이지와 다른 페이지와 함께 사용됩니다.

asp.net의 App_Code 폴더와 같은 것


@MikeBrind 당신은 할 수 없습니다 '탐색'을 / 찾아 직접 어떤 에서 뷰의 /view기본 ASP.NET MVC 프로젝트; /views/web.config파일을 방지하기 위해 설정됩니다. 그러나 컨트롤러 작업이 반환되는 것을 막을 방법은 없습니다. 제대로 View("_Index", model);작동합니다. 방금 뷰 이름을 _Index.cshtml로 변경하고 위에서 한 것처럼 호출하도록 작업을 변경하여 방금했습니다.
Andrew Barber

@MikeBrind이 질문은 웹 페이지가 아닌 MVC에 관한 것입니다. 허가 됨; 나는 원래 의견에 그것을 지정하지 않았다.
Andrew Barber

@ MikeBrind 나는 답변에 응답하고있었습니다. 당신이 아닙니다. 내 초기 의견은 오도의 소지가 있었지만 ( "부분"도 언급 했으므로) 삭제했습니다. 내 요점은 밑줄은 MVC에서 뷰를로드 할 수 없다는 것과 아무런 관련없다는 것입니다. 이 사용자는 "MVC를 사용하지 않습니다"라고 말하기 시작했지만이 질문은 MVC에 대한 것이 었습니다. 나중에이 답변을 읽는 사람 MVC에서 밑줄이 뷰를로드하는 컨트롤러 작업의 기능에 영향을 미친다고 생각하지 않도록합니다. 별거 아냐 우리는 내가 말하는 방식에 무관심하다는 데 동의합니다. 끝난.
Andrew Barber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.