FacebookのBigPipeをかみそりに実装することについて このチュートリアル を更新しようとしています。
リストにページレットを追加し、応答にholdingdivを出力するhtmlヘルパー拡張機能があります。後でこのページレットのコンテンツが文字列にレンダリングされ、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プレースホルダーは、本文の上部、textHolderdivの外側に表示されます。どうしてこれなの?応答がdiv内に出力されるWebフォームビューのようにこれを動作させるにはどうすればよいですか?
ありがとう。
かみそりのビューは裏返しにレンダリングされます。基本的に、コンテンツを一時バッファに書き込みます。一時バッファは、最上位のレイアウトページに到達したときに応答ストリームに書き込まれます。したがって、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>
アイデアは、MVCのほとんどすべてのinput(およびその他の)拡張メソッドが MvcHtmlString を返すという事実に触発されています
ViewBagを使用して文字列をそこに配置し、出力する必要があります。
コントローラー内:
ViewBag.Foo = Bar;
ビューで:
<div>
@ViewBag.Foo
</div>