No sé cómo anexar cosas a las secciones (de hecho me gustaría saber que yo mismo), pero conozco un truco que podría producir un resultado similar. En lugar de usar secciones, puede usar TempData. TempData es muy similar a ViewBag, pero una vez que se establece una variable, vivirá allí para el usuario actual hasta que intente acceder a ella nuevamente (puede vivir a través de unas pocas solicitudes sucesivas para el usuario actual, por lo que se recomienda precaución). A continuación hay un ejemplo de cómo podría usarse.
En el diseño:
@Html.Raw(new MvcHtmlString((string)TempData["BottomSection"]));
En la vista:
@{
var bottomSection = (string)TempData["BottomSection"];
if (bottomSection == null)
{
bottomSection = "";
}
bottomSection += "<script src='~/Scripts/module/article_details.js' type='text/javascript'></script>\n";
bottomSection += "<script src='~/Scripts/module/modal.js' type='text/javascript'></script>\n";
bottomSection += Model.ExtraStuff + "\n";
TempData["BottomSection"] = bottomSection;
}
En la vista parcial:
@{
var bottomSection = (string)TempData["BottomSection"];
if (bottomSection == null)
{
bottomSection = "";
}
bottomSection += "More data";
TempData["BottomSection"] = bottomSection;
}
Esto se puede mejorar aún más por escribir un ayudante para aquellas secciones seudo y \ o moviendo los contenidos de las secciones a parciales separados (mira debajo).
bottomSection += Html.Partial("_StuffToAddToSection").ToString();
Clase auxiliar:
public static class PseudoSectionsHelper
{
public static MvcHtmlString AppendToPseudoSection<T>(this TempDataDictionary TempData, string sectionName, T model, Func<T, HelperResult> content, bool addNewLineCharacter = true)
where T : class
{
return AppendToPseudoSection(TempData, sectionName, content(model).ToString(), addNewLineCharacter);
}
public static MvcHtmlString AppendToPseudoSection(this TempDataDictionary TempData, string sectionName, MvcHtmlString content, bool addNewLineCharacter = true)
{
return AppendToPseudoSection(TempData, sectionName, content.ToString(), addNewLineCharacter);
}
public static MvcHtmlString AppendToPseudoSection(this TempDataDictionary TempData, string sectionName, string content, bool addNewLineCharacter = true)
{
var section = (string)TempData[sectionName];
if (section == null)
{
section = "";
}
else if (addNewLineCharacter)
{
section += "\n";
}
section += content;
TempData[sectionName] = section;
// We return empty MvcHtmlString to be able to use this helper inline (without declaring code block @{ some code... } in view)
return new MvcHtmlString("");
}
public static MvcHtmlString PseudoSection(this TempDataDictionary TempData, string sectionName)
{
var section = (string)TempData[sectionName];
return new MvcHtmlString(section);
}
}
Uso ejemplo
En Diseño de complemento:
@TempData.PseudoSection("BottomSection")
En vista:
@TempData.AppendToPseudoSection("BottomSection", Model, @<text>
<script src='~/Scripts/module/article_details.js' type='text/javascript'></script>
<script src='~/Scripts/module/modal.js' type='text/javascript'></script>
@MvcHtmlString.Create(Model.ExtraStuff)
</text>)
o
@{
TempData.AppendToPseudoSection("BottomSection", Model, @<text>
<script src='~/Scripts/module/article_details.js' type='text/javascript'></script>
<script src='~/Scripts/module/modal.js' type='text/javascript'></script>
@MvcHtmlString.Create(Model.ExtraStuff)
</text>);
}
o incluso
@TempData.AppendToPseudoSection("BottomSection", Html.Partial("BottomSectionScriptsAndStuff"))
Y en parciales:
@TempData.AppendToPseudoSection("BottomSection", "More data")
favor decir por qué esta solución es erróneo. He intentado lo mismo para agregar el html recién generado a la vista ya procesada – amesh
Gracias por su respuesta, pero esto no es lo que quería hacer. La vista parcial puede agregar más referencias de contenido/script, etc. Obtener los datos agregará una solicitud de ida y vuelta y hasta entonces mi página no funcionará. – Kay