Подтвердить что ты не робот

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?

Спасибо.

4b9b3361

Ответ 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?