ASP.Net MVC 3 Razor Response.Write位置

时间:2011-04-10 10:06:50

标签: c# asp.net-mvc-3 razor response.write

我正在尝试更新this tutorial有关将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>");
}

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

<div id="textHolder">
    <% Html.RegisterPagelet(myPagelet); %>
</div>

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

所以

<div id="textHolder">
    <div id="pageletPlaceHolder"></div>
</div>

然而,当我在Razor中尝试相同时:

<div id="textHolder">
    @{ Html.RegisterPagelet(myPagelet);  }
</div>

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

感谢。

4 个答案:

答案 0 :(得分:42)

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

解决方案是使用:

helper.ViewContext.Writer.Write("<div id=\"" + pagelet.Container + "\"></div>");

答案 1 :(得分:4)

将您的方法更改为无效,但返回MvcHtmlString

public static MvcHtmlString OutputText(this HtmlHelper helper, string text) {
     return New MvcHtmlString(text);
}

比以往使用这个

<div id="textHolder">
    @Html.OutputText("FooBar");
</div>

理念的灵感来自于MVC中的几乎所有输入(和其他)扩展方法都返回MvcHtmlString

答案 2 :(得分:0)

你应该使用ViewBag并将字符串放在那里,然后输出它。

在控制器中:

ViewBag.Foo = Bar;

在视图中:

<div>
@ViewBag.Foo
</div>

答案 3 :(得分:-4)

我不打算这样做。您想要的最终结果是FooBar内写有div,那么为什么不将它写入您的div?为什么需要使用Response.Write