2011-01-25 2 views
2

Я только что получил некоторую ошибку, что я не ожидал увидеть ...Razor View - Неприятности с раздела

Чтобы быть ясно, я покажу рабочий код и код ошибки:

Это работая

_MainLayout.cshtml

<div id="content"> 
    <h1>@Page.Title</h1> 
    @RenderSection("left", false) 
    @RenderBody() 
</div> 

Page.cshtml

@section left{ 
<p>Some text on left side</p> 
} 

<div> 
    Some content 
</div> 

В этом случае все работает нормально, но когда я удалил @RenderSection("left", false) внутри _MainLayout.cshtml, я получаю исключение! В каком случае он мне нужен? Смотрите пример ниже:

Это не работает

_MainLayout.cshtml

@if (WebSecurity.IsAuthenticated) { 
    <h1>@Page.Title</h1> 
    @RenderSection("left", false) 
    @RenderBody() 
} else { 
    <h1>You not logged in!</h1> 
    <p>To see this page, you have to login first.</p> 
} 

Page.cshtml

@section left{ 
<p>Some text on left side</p> 
} 

<div> 
    Some content 
</div> 

В этом случае, если пользователь не прошел проверку подлинности, у меня есть это исключение :

Описание:An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Сведения об исключении:System.Web.HttpException: Следующие разделы были определены, но не были обработаны для страницы макета "~/_MainLayout.cshtml": "left". Что можно перевести как:Section was created but wasn't rendered for layout page "~/_MainLayout.cshtml": "left".

Источник ошибки:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Трассировка стека:

[HttpException (0x80004005): Следующие разделы были определены, но не были обработаны для страницы макета "~/_MainLayout.cshtml": "left".] 
    System.Web.WebPages.WebPageBase.VerifyRenderedBodyOrSections() +91298 
    System.Web.WebPages.WebPageBase.PopContext() +332 
    System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +95 
    System.Web.WebPages.<>c__DisplayClass7.<RenderPageCore>b__6(TextWriter writer) +102 
    System.Web.WebPages.HelperResult.WriteTo(TextWriter writer) +12 
    System.Web.WebPages.WebPageBase.Write(HelperResult result) +67 
    System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName, Action`1 body) +66 
    System.Web.WebPages.WebPageBase.PopContext() +262 
    System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +95 
    System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContext context) +249 

Вопрос в следующем: как я могу заставить его работать? Любые советы ценны!

ответ

2

Проблема в том, что вы все еще объявляете раздел в своем дочернем представлении, а механизм рендеринга бритвы не знает, что с ним делать.

Я не уверен, что лучший способ справиться с этим будут какие-то возможные обходные пути:

  • Перемещение RenderSection("left", false) вне тела if блока.
  • Процесс вашей безопасности в контроллере, а также отображать другую точку зрения в целом, если пользователь не должен видеть ничего (это, вероятно, предпочтительнее)
+0

Это смешно, но я не использую MVC. (Я просто играю с WebMatrix и пытаюсь реализовать часть своей идеи). Почему обработка безопасности на каждой странице выглядит глупо ... Но я попытаюсь сделать перенаправление на страницу с ошибкой. Может быть, это сработает. Спасибо, что напомнили мне об этом;) – RAMe0

+0

Ну конечно, я должен был подняться в классе WebSecurity. У меня нет большого опыта работы с WebMatrix, но я предполагаю, что Razor ведет себя аналогичным образом. Возможно, вы пытаетесь сделать что-то, что выходит за рамки WebMatrix? –

+0

Да, знаю. Я понял, что WebMatrix не подходит мне, как я ожидал. Но все же у него есть очень полезные вещи. Теперь я использую 'Context.RedirectLocal', который перенаправляет пользователя на страницу с ошибкой, когда он не вошел в систему. Это отлично работает для меня. – RAMe0

1

К сожалению, этот «вопрос» по-прежнему сохраняется с Razor (Фактически, на веб-страницах).Общее решение, которое я видел (и реализуется при необходимости), чтобы отбрасывать содержимое раздела в нуль TextWriter:

@if (WebSecurity.IsAuthenticated) { 
    <h1>@Page.Title</h1> 
    @RenderSection("left", false) 
    @RenderBody() 
} else { 
    <h1>You not logged in!</h1> 
    <p>To see this page, you have to login first.</p> 
    @{ 
     WriteTo(TextWriter.Null, RenderSection("left")); 
    } 
} 

Вызов к RenderSection удовлетворяет наложенного требованию вызова соответствующего RenderSection для каждой секции определены. Дампирование TextWriter.Null сбрасывает содержимое, а также обеспечивает минимальное воздействие на потребление памяти (других реализаций используют new StringWriter(), но содержание временно в буферной памяти)

Это хак, но он работает; Я пытаюсь скрыть это как часть процесса рендеринга.