2011-02-04 2 views
6

은 내가 (작동하지 않는) 다음에 Page.cshtml 비슷한 있습니다asp.net mvc Razor ViewEngine을 사용하여 @section을 선택적으로 만들 수있는 방법이 있습니까?

@{ 
    Layout = "../Shared/Layouts/_Layout.cshtml"; 
    var mycollection = (ViewBag.TheCollection as IQueryable<MyCollectionType>); 
} 

<h2>@ViewBag.Title</h2> 

content here 

@if (mycollection != null && mycollection.Count() > 0) 
{  
    @section ContentRight 
    {  
     <h2> 
      Stuff 
     </h2> 
     <ul class="stuff"> 
      @foreach (MyCollectionType item in mycollection) 
      { 
       <li class="stuff-item">@item.Name</li> 
      } 
     </ul> 
    } 
} 

내가 말했듯이,이 작동하지 않습니다. 컬렉션에 아무것도없는 경우 섹션을 정의하지 않으려합니다. 이 작품과 같은 것을 가질 수있는 방법이 있습니까? 그렇지 않다면 다른 옵션은 무엇입니까? 나는이 면도기 ViewEngine을 처음 사용했습니다. 내 레이아웃에서

편집

는 내가 가지고 : 섹션이 비어있을 때

@if(IsSectionDefined("ContentRight")) 
{ 
    <div class="right"> 
     RenderSection("ContentRight") 
    </div> 
} 

는 내가 원하는 않는다 출력 사업부입니다.

답변

3

내가 그것을 필요로하는 방식으로 작동하도록해라. 내 페이지에

난이 :

@{ 
    Layout = "../Shared/Layouts/_Layout.cshtml"; 
    var mycollection = (ViewBag.TheCollection as IQueryable<MyCollectionType>); 
    ViewBag.ShowContentRight = mycollection != null && mycollection.Count() > 0; 
} 

는 내 레이아웃에 내가있다 : 섹션을 정의

@if(IsSectionDefined("ContentRight") && (ViewBag.ShowContentRight == null ||ViewBag.ShowContentRight == true)) 
{ 
    <div class="right"> 
     RenderSection("ContentRight") 
    </div> 
} 
else if(IsSectionDefined("ContentRight")) 
{ 
    RenderSection("ContentRight") 
} 

경우 렌더링되어야하지만, 내가 원하는 해달라고 아무 내용도 존재하지 않는 경우 <div> s

내가 알고 싶은 더 좋은 방법이 있다면.

+0

불행히도 그것은 아마도 현재 가장 좋은 선택 일 것입니다. 또 다른 가능한 옵션은 "@section"이 번역 된 DefineSection을 직접 호출하는 것입니다. 문제는 Razor v2에서 람다 안에 Markup을 넣을 수 없다는 것입니다 (앞으로 살펴볼 내용). @helper 구문에서 콘텐츠를 정의하고 DefineSection 람다에서 해당 도우미를 호출해야합니다. . 결국, 당신이 가진 방식대로하는 것이 더 쉽게 끝날 수도 있습니다. 그러나 우리는 차후 버전에서 이것을 향상시킬 것입니다! –

-1

당신은 IsSectionDefined

Layout.cshtml과 if 문에 전체 섹션을 포장 할 수 있습니다

@if (IsSectionDefined("ContentRight")) 
{ 
    <div> 
    @RenderSection(name: "ContentRight", required: false) 
    </div> 
} 

귀하의 cshtml 페이지 : 나는 조금 해키 뭔가를하고 결국

@section ContentRight 
{  
    @if (mycollection != null && mycollection.Count() > 0) 
    { 
    <h2> 
     Stuff 
    </h2> 
    <ul class="stuff"> 
     @foreach (MyCollectionType item in mycollection) 
     { 
      <li class="stuff-item">@item.Name</li> 
     } 
    </ul> 
    } 
} 
+0

당신이 내가 현재 가지고있는 사용자들은 필요 = 거짓 – ajma

+0

로 rendersection를 레이아웃 파일에 IsSectionDefined을 넣고 전화를하고 싶지만, 그것의 섹션이 없기 때문에 섹션이 정의되기 때문에 div를 출력합니다. –

+0

주위의 div가 IsSectionDefined로 래핑되는 경우 어떻게해야합니까? – ajma

2

렌더러가 레이아웃 파일에서 메소드를 언젠가 호출 할 것으로 예상하고 있습니다. 렌더러를 스푸핑하고 "글로벌"조건을 사용할 수 있습니다 (로그인 생각). 퍼포 레이션에 대한 개인 정적 읽기 전용 필드 정보와

@{ 
    ViewBag.content = RenderBody(); 
} 
@if (Request.IsAuthenticated) { 
     @ViewBag.content; 
} 
else { 
     @Html.Partial("_LoginPartial") 
} 
0

확장 방법 : 당신의 cshtml에서

private static readonly FieldInfo RenderedSectionsFieldInfo = typeof(WebPageBase).GetField("_renderedSections", BindingFlags.Instance | BindingFlags.NonPublic); 

public static void EnsureSectionsAreRegisteredAsRendered(this WebPageBase webPageBase, params string[] sectionNames) 
{ 
    var renderedSections = RenderedSectionsFieldInfo.GetValue(webPageBase) as HashSet<string>; 
    if (renderedSections == null) 
    { 
     throw new WebCoreException("Could not get hashset from private field _renderedSections from WebPageBase");  
    } 
    foreach (var sectionName in sectionNames) 
    { 
     if (!renderedSections.Contains(sectionName)) 
     { 
      renderedSections.Add(sectionName); 
     } 
    } 
} 

:

@{ this.EnsureSectionsAreRegisteredAsRendered("SectionName1", " SectionName2", "…"); } 

그래, 그래, 그래 .... 나도 알아 ... 나쁜 반사! 당신이보기 기본 클래스가없는 경우

public HelperResult RenderSection(string name, Func<dynamic, HelperResult> defaultContents) 
{ 
    if (IsSectionDefined(name)) 
    { 
     return RenderSection(name); 
    } 
    return defaultContents(null); 
} 

, 내가 추천 : 당신의 자신의 위험 : 내가보기 기본 클래스에서 다음과 같은 방법을 사용

0

(이 우수 블로그 게시물에서 http://haacked.com/archive/2011/03/05/defining-default-content-for-a-razor-layout-section.aspx/)에 사용 왜냐하면 모든 종류의 작은 추가 기능을 뷰에 추가 할 수 있기 때문입니다.다만 다음과 같은 서명 클래스를 생성 : public abstract class MyViewPage<T> : WebViewPage<T>를 다음에서 설정하여 web.config :

<system.web.webPages.razor> 
    <pages pageBaseType="MyViewPage"> 
    ... 
    </pages> 
</system.web.webPages.razor> 
관련 문제