2011-08-04 3 views
4

내가 뭔가 잘못하고 있으면 나는 깨달음을 얻고 싶다. 나는있을거야.ASP.NET MVC에서 @RenderSection (@RenderPage와 비교)을 사용하면 어떤 이점이 있습니까?

내보기 페이지에 다음 코드가있는 경우 : (사용 가능한 경우) 런에서 예외를 방지하기 위해

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

<h2>About</h2> 
<p> 
    sample content. 
</p> 
@section header 
{ 
    <div id="header"> 
     Chapter 3a: Creating a Consistent Look 
    </div> 
} 

... 나는 또한 섹션을 렌더링하는 내 레이아웃 페이지에서 FF를해야한다을 시간 : 즉 (예를 들어, 내가 그들 모두를 주석) 섹션을 렌더링하기 전에 섹션을 확인합니다 위에 나는 마지막 4 개 라인이없는 경우

@if (IsSectionDefined("header")) 
{ 
    @RenderSection("header") 
} 

그러나, 컴파일러가 나는 부분이 있는지 확인하지 않습니다 내보기 페이지에 정의되어 있으며 응용 프로그램을 빌드하고 실행할 수 있습니다. 런타임 동안, 내가 페이지를 실행할 때이 오류를 얻을 것이다에만 다음입니다 :

다음 섹션이 정의되어 있지만, 레이아웃 페이지 "~에 대한 렌더링되지 않은/조회/공유/_Layout2.cshtml ":"헤더 ".

내 질문은 다음 FF 있습니다

  1. 우리가 어떻게 발생하지 않도록 할 수 있습니까? 컴파일러가 누락 된 코드 @RenderSection을 확인하도록하는 설정이 있습니까?
  2. 전체 응용 프로그램에서 @section 키워드가 있는지 수동으로 검색해야하기 때문에 @section 기능을 사용하면 시스템 유지 관리가 쉽지 않습니다 (질문 1에 긍정적 인 답변이없는 것으로 가정).
  3. 이 경우 @RenderPage과 반대로 @RenderSection을 사용하면 어떤 이점이 있습니까?
  4. @section도 조건부로 만들 수 있습니까?

답변

2

저는 이것을 문제로 생각한 적이 없습니다. 개념은 aspx 구문의 자리 표시 자와 동일하므로 홈페이지에 2 개의 자리 표시자가있는 경우 해당 마스터 페이지를 사용하여 각 페이지 /보기에 2 개의 내용이 있어야합니다.

필 하크 (Phil Haack)의 블로그 게시물이 논점에 있지만, 직접적으로 귀하의 우려 사항을 해결하지는 않지만 고려해야 할 부분은 분명 흥미 롭습니다.

http://haacked.com/archive/2011/03/05/defining-default-content-for-a-razor-layout-section.aspx

+0

빠른 답변 감사드립니다.내가 이해하는 것으로부터 섹션의 관계에 대한 섹션의 관계에 관해서는 서버 측 코드에서 자리 표시 자 객체의 존재 여부를 확인합니다 (코드에서 배후 객체를 사용할 수 없으므로이 배후 객체는 그렇지 않습니다). 귀하의 페이지에 존재), 문자열 (예 : "헤더")는 컴파일 타임에 확인되지 않습니다. 내가 자리 표시 자의 사용법을 올바르게 이해하고 있기를 바랍니다. 감사! – nolisj

+0

사실, 그렇지 않습니다. 그것이 작동하는 방식이 아닙니다. 코드 숨김은 전혀 관련이 없습니다. 실제로 Mvc2 aspx 뷰에는 코드 숨김 코드조차 없기 때문에 내 말은 개념 수준에서 태그는 @RenderSection() 문과 동일하고 태그는 @section {} 선언과 동일하다는 것입니다. 나는 그들이 똑같이 작동한다는 것을 암시하지는 않았다. 아직도 저는 컴파일 타임에 둘 중 어느 것도 검사하지 않는다고 확신합니다. csproj에서 태그를 true로 설정하고 어떤 것이 향상되는지 확인할 수 있습니다. –

+0

나는 당신이 의미하는 것을 이해합니다. 나는이 자리 표시 자 ()보다이 자리 표시 자 ()를 언급한다고 생각했습니다. 유사점 (ContentPlaceHolder == @RenderSection(); Content == @section)에 대해서는 이해하는 한 올바른 것으로 보입니다. 그러나 ContentPlaceHolder/Content 쌍이 @RenderSection()/@ 섹션 쌍과 다른 점은 ContentPlaceHolder/Content 쌍 (및 서로의 관계)이 @RenderSection()/@보다 더 분명하고 명시 적/섹션 쌍. – nolisj

2

내가이 통과 옛하지만 경우에 사람을 알고있다.

@RenderSection ("header", required : false)이 경우에는보기 페이지에 @section 헤더 {}가있을 수도 있고 그렇지 않을 수도 있습니다.

이제 레이아웃에서 확인 조건을 제거 할 수도 있습니다. 또한 이것으로 조건부!

이 필요하면 다음을 수행 할 수 있습니다. @RenderSection ("header", required : true)하지만 뷰에 @section 헤더가 없으면 오류가 발생합니다.

관련 문제