ASP.Net MVC 3 Razor Response.Write位置
我正在尝试将有关实施Facebook BigPipe的教程更新为razor。
有一个html助手扩展,它将一个pagelet添加到列表中,然后向响应输出一个保持div。 这个想法是稍后将这个pagelet的内容呈现为一个字符串,然后通过javascript注入到这个hold div中。
public static void RegisterPagelet(this HtmlHelper helper, Pagelet pagelet) { var context = helper.ViewContext.HttpContext; List pagelets = (List)context.Items["Pagelets"]; if (pagelets == null) { pagelets = new List(); context.Items["Pagelets"] = pagelets; } pagelets.Add(pagelet); context.Response.Write(""); }
在示例中,此函数的调用方式如下:
这会将小页面添加到列表中,并将保留div输出到响应流。
所以
但是,当我在Razor中尝试相同时:
@{ Html.RegisterPagelet(myPagelet); }
div占位符显示在bodyHolder div之外的正文顶部。 为什么是这样? 我怎样才能使这个行为像在div中输出响应的webforms视图?
谢谢。
剃刀视图从里到外呈现。 基本上,它将内容写入临时缓冲区,当达到最顶层布局页面时,这些缓冲区将写入响应流。 因此,直接写入来自HtmlHelper扩展的响应流,将无序输出。
解决方案是使用:
helper.ViewContext.Writer.Write("");
将您的方法更改为无效,但返回MvcHtmlString
public static MvcHtmlString OutputText(this HtmlHelper helper, string text) { return New MvcHtmlString(text); }
比以往使用这个
@Html.OutputText("FooBar");
Idea的灵感来自于MVC中的几乎所有输入(和其他)扩展方法都返回MvcHtmlString
您应该使用ViewBag并将字符串放在那里,然后输出它。
在控制器中:
ViewBag.Foo = Bar;
在视图中:
@ViewBag.Foo
我不打算这样做。 你想要的最终结果是你的div
写了FooBar
,为什么不把它写进你的div? 为什么需要使用Response.Write
?