ASP.Net MVC 3 Razor Response.Write位置

Ter*_*rry 18 c# response.write razor asp.net-mvc-3

我正在尝试更新关于将Facebook BigPipe实施到剃须刀的教程.

有一个html助手扩展,它将一个pagelet添加到列表中,然后将一个保持div输出到响应中.我的想法是,稍后将此pagelet的内容呈现为字符串,然后通过javascript注入此持有div.

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>");
}
Run Code Online (Sandbox Code Playgroud)

在示例中,此函数的调用方式如下:

<div id="textHolder">
    <% Html.RegisterPagelet(myPagelet); %>
</div>
Run Code Online (Sandbox Code Playgroud)

这会将小页面添加到列表中,并将保留div输出到响应流.

所以

<div id="textHolder">
    <div id="pageletPlaceHolder"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

但是,当我在Razor中尝试相同时:

<div id="textHolder">
    @{ Html.RegisterPagelet(myPagelet);  }
</div>
Run Code Online (Sandbox Code Playgroud)

div占位符显示在bodyHolder div之外的正文顶部.为什么是这样?我怎样才能使这个行为像在div中输出响应的webforms视图?

谢谢.

Jam*_*ull 41

剃刀视图从里到外呈现.基本上,它将内容写入临时缓冲区,当达到最顶层布局页面时,这些缓冲区将写入响应流.因此,直接写入来自HtmlHelper扩展的响应流,将无序输出.

解决方案是使用:

helper.ViewContext.Writer.Write("<div id=\"" + pagelet.Container + "\"></div>");
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,你整理了一下头部刮擦:) (2认同)
  • 特里你试过@ Html.Raw吗? (2认同)