簡體   English   中英

ASP.Net MVC 3 Razor Response.Write位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM