HtmlHelper, использующий ViewContext.Writer, неправильно отображает - PullRequest
0 голосов
/ 30 августа 2010

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

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

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

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

Я использовал частичные запросы раньше, и они всегда отображаются в правильном месте.Я еще не использовал их с 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));
    }

Возможно, это что-то простое ... Разве не всегда :))

РЕДАКТИРОВАТЬ:

Даже приведенные ниже не отображаются правильно, принимая предыдущие комментарии для использования ViewContext.Writer вместо этого не имеет никакого значения.

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

Спасибо,

Ян

Ответы [ 2 ]

1 голос
/ 30 августа 2010

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

0 голосов
/ 02 ноября 2011

Извиняюсь за то, что нашел годичный вопрос, но я реализовал код OP и не могу воспроизвести эту проблему на 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>
...