c# - sintaxis - ASP.Net MVC 3 Razor Response.Write posición
sintaxis razor mvc 5 (4)
Estoy intentando actualizar este tutorial sobre la implementación de BigPipe de Facebook en la maquinilla de afeitar.
Hay una extensión html helper que agrega un pagelet a una lista y luego genera un div de retención para la respuesta. La idea es que más adelante, el contenido de este pagelet se represente en una cadena y luego se inyecte en este div holding a través de javascript.
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>");
}
En el ejemplo esta función se llama así:
<div id="textHolder">
<% Html.RegisterPagelet(myPagelet); %>
</div>
Lo que agrega el pagelet a las listas y envía el div de retención al flujo de respuesta.
Asi que
<div id="textHolder">
<div id="pageletPlaceHolder"></div>
</div>
Sin embargo, cuando intento lo mismo en Razor:
<div id="textHolder">
@{ Html.RegisterPagelet(myPagelet); }
</div>
El marcador de posición div aparece en la parte superior del cuerpo, fuera de textHolder div. ¿Por qué es esto? ¿Cómo puedo hacer que esto se comporte como la vista de formularios web donde la respuesta se genera dentro del div?
Gracias.
Cambie su método para que no sea nulo, pero devuelva MvcHtmlString
public static MvcHtmlString OutputText(this HtmlHelper helper, string text) {
return New MvcHtmlString(text);
}
Que utilizar esto como solías
<div id="textHolder">
@Html.OutputText("FooBar");
</div>
Idea está inspirada en el hecho de que casi todos los métodos de extensión de entrada (y otros) en MVC devuelven MvcHtmlString
Debería usar el ViewBag y colocar la cadena allí, luego mostrarla.
En el controlador:
ViewBag.Foo = Bar;
En vista:
<div>
@ViewBag.Foo
</div>
No me molestaría en hacerlo. El resultado final que desea es tener escrito FooBar
en su div
, así que, ¿por qué no escribirlo en su div? ¿Por qué necesitas usar Response.Write
?
Una vista de Razor se traduce de adentro hacia afuera. Básicamente, escribe contenido en búferes temporales que se escriben en el flujo de respuesta cuando se alcanza la página de diseño superior. Por lo tanto, escribir directamente en el flujo de respuesta desde su extensión HtmlHelper, lo desestabilizará.
La solución es utilizar:
helper.ViewContext.Writer.Write("<div id=/"" + pagelet.Container + "/"></div>");