2011-04-10 95 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