Я создаю простую 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>
Спасибо,
Ян
Пожалуйста, покажите нам свой метод расширения. – SLaks
@SLaks Я добавил код, дайте мне знать, если вам нужно больше. Хотя, как упоминалось, каждый метод визуализации виджета изменяется, поэтому я их не включил. – madcapnmckay
это может быть «новая строка WidgetContext (..)»? возможно, создается новый поток «поток», а не используемый существующий. я говорю это, но не испытал мое предположение. –