2011-04-10 65 views
18

我想更新this tutorial实施Facebook BigPipe剃须刀。ASP.Net MVC 3 Razor Response.Write position

有一个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> 

然而,当我尝试同样的剃刀:

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

在div占位符出现在机身的顶部,textHolder DIV之外。为什么是这样?我怎么能得到这个行为像webforms视图中的div内输出响应?

谢谢。

回答

40

剃刀视图内向外呈现的事实启发。基本上,它将内容写入临时缓冲区,当达到最顶层布局页面时,会将其写入响应流。因此,直接写入HtmlHelper扩展的响应流将会按顺序输出。

的解决方案是使用:

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

太棒了!这工作。谢谢。 – Terry 2011-04-10 15:47:37

+2

谢谢,你整理了一下头部有点划伤:) – MemeDeveloper 2011-10-01 23:04:47

+2

特里你试过@ Html.Raw吗? – 2012-09-12 20:18:25

-4

我不会这么做。你想要的最终结果是FooBar写在你的div,所以为什么不把它写入你的div?为什么你需要使用Response.Write

+0

我看到了一个教程使用的小页(Facebook的术语,其服务是并行的服务器端处理的数据块页),我试图将其更新到剃须刀。实际的辅助函数被传递给一个pagelet,并将其添加到存储在http上下文中的列表中。在将pagelet添加到此列表后,我需要输出一个骨架div,以便我可以在稍后注入内容。因此我使用回应。写入而不是返回一个字符串。 – Terry 2011-04-10 10:20:33

+1

因为有些时候它可以完全有效地显式写入输出流。 – Craig 2013-09-23 00:41:00

0

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

在控制器:

ViewBag.Foo = Bar; 

鉴于:

<div> 
@ViewBag.Foo 
</div> 
4

改变你的方法是不为空,但返回MvcHtmlString

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

不是用这个作为你用来

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

想法是通过几乎每个输入(和其他)扩展方法在MVC返回MvcHtmlString

+0

我刚刚更新了这个问题,使其更清楚了我想要做的事情。我不想走这条路线,因为虽然它可以用于这个初始占位符,但稍后在请求中,我会处理此占位符的内容,并希望将其输出到响应中。我不想返回一个字符串,因为它可能是一个非常大的字符串,我担心性能。 – Terry 2011-04-10 10:30:09

+0

字符串创建反正:)。您可以分离目标字符串创建逻辑及其使用逻辑。用法逻辑可能是两种方法,一种是直接将生成的字符串写入响应流,另一种是用于创建MvcHtmlString以用于剃须刀。另外,完全以其他方式,您可以为Pagelet创建部分视图。哪些可以被其他剃刀视图使用,也可以直接写入 – archil 2011-04-10 10:39:57

+0

在我调用RegisterPagelet助手之后,在我的布局视图的末尾调用另一个名为ExecutePagelet的函数。这对pagelets执行并行循环,渲染每个页面,然后将其写入响应并刷新它。我不认为一串会帮助我。事实上,响应写入在一个错误中表现如此不同? – Terry 2011-04-10 10:52:37