web-dev-qa-db-ja.com

ASP.Net MVC 3 RazorResponse.Write位置

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フォームビューのようにこれを動作させるにはどうすればよいですか?

ありがとう。

18
Terry

かみそりのビューは裏返しにレンダリングされます。基本的に、コンテンツを一時バッファに書き込みます。一時バッファは、最上位のレイアウトページに到達したときに応答ストリームに書き込まれます。したがって、HtmlHelper拡張機能から応答ストリームに直接書き込むと、順序が狂って出力されます。

解決策は次のとおりです。

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

メソッドを無効にしないように変更しますが、MvcHtmlStringを返します

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

以前のようにこれを使用するより

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

アイデアは、MVCのほとんどすべてのinput(およびその他の)拡張メソッドが MvcHtmlString を返すという事実に触発されています

4
archil

ViewBagを使用して文字列をそこに配置し、出力する必要があります。

コントローラー内:

ViewBag.Foo = Bar;

ビューで:

<div>
@ViewBag.Foo
</div>
0
Bas