2010-08-30 2 views
0

Я создаю простую CMS с asp.net MVC, и у меня почти все части работают. У меня есть одна незначительная проблема, и я не могу решить, как ее решить. У меня есть метод Html helper, который отображает содержимое области. Однако этот метод использует Response.Write для записи своего содержимого, а не для возврата строки. Причина этого в том, что я выполняю частичный запрос и, следовательно, не возвращаю строку.HtmlHelper с использованием ViewContext.Writer не отображается правильно

Мой шаблон тело выглядит следующим образом:

<body> 
    <h1>Default Template</h1> 
    <% Html.ContentArea("Main"); %> 
</body> 

Проблема у меня в том, что содержание делает выше тега H1. Я понимаю, что h1 уже должен быть в ответе, и мой звонок на response.Write() будет поэтому добавлять контент после этой точки. Это, очевидно, не происходит. Что мне здесь не хватает.

Раньше я использовал partial requests, и они всегда визуализируются в нужном месте. Я еще не использовал их с MVC 2, это может быть проблемой.

Ниже приведен метод расширения области содержимого. Метод визуализации виджета изменяется и где происходит частичный запрос. Однако даже начальный и конечный тег контейнера отображают выше h1, поэтому он должен быть чем-то фундаментальным, я делаю неправильно.

public static void ContentArea(this HtmlHelper htmlHelper, string areaName) 
    { 
     var container = new TagBuilder("div"); 
     container.GenerateId(areaName); 
     container.AddCssClass("content-area"); 

     var response = htmlHelper.ViewContext.HttpContext.Response; 

     response.Write(container.ToString(TagRenderMode.StartTag)); 

     var pageWidgets = htmlHelper.ViewData[areaName] as IList<PageWidget>; 
     if (pageWidgets != null) 
      foreach (var widget in pageWidgets) 
      { 
       widget.GetInstance().Render(new WidgetContext(htmlHelper.ViewContext, widget)); 
      } 

     response.Write(container.ToString(TagRenderMode.EndTag)); 
    } 

Это, вероятно, что-то просто ... Не всегда :)

EDIT:

Даже ниже не делает правильно принимать предыдущие комментарии использовать ViewContext.Writer вместо ДАЕТ НИКАКИХ разница.

public static void ContentArea(this HtmlHelper htmlHelper, string areaName) 
    { 
     var container = new TagBuilder("div"); 
     container.GenerateId(areaName); 
     container.AddCssClass("content-area"); 

     var writer = htmlHelper.ViewContext.Writer; 

     writer.Write(container.ToString(TagRenderMode.StartTag)); 

     writer.Write(container.ToString(TagRenderMode.EndTag)); 
    } 

Это делает, как

<div id="Main" class="content-area"></div> 
<h1>Default Template</h1> 

Спасибо,

Ян

+0

Пожалуйста, покажите нам свой метод расширения. – SLaks

+0

@SLaks Я добавил код, дайте мне знать, если вам нужно больше. Хотя, как упоминалось, каждый метод визуализации виджета изменяется, поэтому я их не включил. – madcapnmckay

+0

это может быть «новая строка WidgetContext (..)»? возможно, создается новый поток «поток», а не используемый существующий. я говорю это, но не испытал мое предположение. –

ответ

1

Вы пробовали использовать ViewContext.Writer.Write, а не Response.Write? Я думаю, что это то, что я использую в своих методах расширения, и у меня не было никаких проблем.

+0

Я пробовал оба, они производят точно такой же выход. Я включил упрощенный метод, который также дает тот же результат. – madcapnmckay

0

Извинения для выкапывания годовалого вопрос с, но я реализовал код Ор, и я не могу воспроизвести этот вопрос на ASP.NET MVC 2.

С этим, на мой взгляд ...

<body> 
    <h1>Default Template</h1> 
    <% Html.ContentArea2("Main"); %> 
</body> 

... Я получаю этот вывод, сгенерированный:

<body> 
    <h1>Default Template</h1> 
    <div class="content-area" id="Main"></div> 
</body> 
Смежные вопросы