[英]ASP.Net MVC 3 Razor Response.Write position
我正在嘗試更新關於將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占位符顯示在bodyHolder div之外的正文頂部。 為什么是這樣? 我怎樣才能使這個行為像在div中輸出響應的webforms視圖?
謝謝。
剃刀視圖從里到外呈現。 基本上,它將內容寫入臨時緩沖區,當達到最頂層布局頁面時,這些緩沖區將寫入響應流。 因此,直接寫入來自HtmlHelper擴展的響應流,將無序輸出。
解決方案是使用:
helper.ViewContext.Writer.Write("<div id=\"" + pagelet.Container + "\"></div>");
將您的方法更改為無效,但返回MvcHtmlString
public static MvcHtmlString OutputText(this HtmlHelper helper, string text) {
return New MvcHtmlString(text);
}
比以往使用這個
<div id="textHolder">
@Html.OutputText("FooBar");
</div>
Idea的靈感來自於MVC中的幾乎所有輸入(和其他)擴展方法都返回MvcHtmlString
您應該使用ViewBag並將字符串放在那里,然后輸出它。
在控制器中:
ViewBag.Foo = Bar;
在視圖中:
<div>
@ViewBag.Foo
</div>
我不打算這樣做。 你想要的最終結果是你的div
寫了FooBar
,為什么不把它寫進你的div呢? 為什么需要使用Response.Write
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.