ASP.Net MVC 3 Razor Response.Write position
Я пытаюсь обновить этот учебник по реализации Facebook BigPipe для бритвы.
Существует расширение html-помощника, которое добавляет лист-лист в список, а затем выводит на него ответный запрос. Идея заключается в том, что позже содержимое этой страницы отображается в строку, а затем вводится в этот холдинг div через javascript.
public static void RegisterPagelet(this HtmlHelper helper, Pagelet pagelet) {
var context = helper.ViewContext.HttpContext;
List<Pagelet> pagelets = (List<Pagelet>)context.Items["Pagelets"];
if (pagelets == null) {
pagelets = new List<Pagelet>();
context.Items["Pagelets"] = pagelets;
}
pagelets.Add(pagelet);
context.Response.Write("<div id=\"" + pagelet.Container + "\"></div>");
}
В примере эта функция вызывается следующим образом:
<div id="textHolder">
<% Html.RegisterPagelet(myPagelet); %>
</div>
Что добавляет проспект в списки и выводит удерживающий div в поток ответов.
So
<div id="textHolder">
<div id="pageletPlaceHolder"></div>
</div>
Однако, когда я делаю то же самое в Razor:
<div id="textHolder">
@{ Html.RegisterPagelet(myPagelet); }
</div>
Заполнитель div появляется в верхней части тела, за пределами div текстового поля. Почему это? Как я могу заставить это вести себя как представление webforms, где ответ выводится внутри div?
Спасибо.
Ответы
Ответ 1
A Вид бритвы визуализирован наизнанку. В основном он записывает контент в временные буферы, которые записываются в поток ответов, когда достигается самая верхняя страница макета. Таким образом, запись непосредственно в поток ответов из вашего расширения HtmlHelper приведет к его выходу из строя.
Решение заключается в использовании:
helper.ViewContext.Writer.Write("<div id=\"" + pagelet.Container + "\"></div>");
Ответ 2
Измените свой метод, чтобы он был непустым, но возвращающий MvcHtmlString
public static MvcHtmlString OutputText(this HtmlHelper helper, string text) {
return New MvcHtmlString(text);
}
Чем это используется при использовании
<div id="textHolder">
@Html.OutputText("FooBar");
</div>
Идея вдохновлена тем фактом, что почти каждый метод ввода (и другого) в MVC возвращает MvcHtmlString
Ответ 3
Вы должны использовать ViewBag и поместить туда строку, а затем вывести ее.
В контроллере:
ViewBag.Foo = Bar;
В поле зрения:
<div>
@ViewBag.Foo
</div>
Ответ 4
Я бы не стал это делать. Конечный результат, который вы хотите, это t FooBar
, написанный в вашем div
, так почему бы просто не записать его в свой div? Зачем вам нужно использовать Response.Write
?