non so come aggiungere roba per sezioni (in realtà mi piacerebbe sapere che io stesso), ma conosco un trucco che potrebbe produrre un risultato simile. Invece di usare le sezioni si può usare TempData. TempData è molto simile a ViewBag, ma una volta che una variabile è impostata, vivrà lì per l'utente corrente fino a quando uno cerca di accedervi di nuovo (può vivere attraverso alcune richieste successive per l'utente corrente, quindi si consiglia cautela extra). Di seguito è riportato un esempio di come potrebbe essere utilizzato.
Nella layout:
@Html.Raw(new MvcHtmlString((string)TempData["BottomSection"]));
Nella 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;
}
Nella vista parziale:
@{
var bottomSection = (string)TempData["BottomSection"];
if (bottomSection == null)
{
bottomSection = "";
}
bottomSection += "More data";
TempData["BottomSection"] = bottomSection;
}
Questo può essere ulteriormente migliorata crei un'assistente per quelle sezioni pseudo e \ o spostando il contenuto delle sezioni un partial parziale (guarda sotto).
bottomSection += Html.Partial("_StuffToAddToSection").ToString();
classe Helper:
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);
}
}
Usa esempio
In Layout Aggiungi:
@TempData.PseudoSection("BottomSection")
In considerazione:
@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 anche
@TempData.AppendToPseudoSection("BottomSection", Html.Partial("BottomSectionScriptsAndStuff"))
E in parziale:
@TempData.AppendToPseudoSection("BottomSection", "More data")
informi il motivo per cui questa soluzione è sbagliata. Ho provato lo stesso per accodare l'html appena generato alla vista già renderizzata – amesh
Grazie per la tua risposta, ma questo non volevo. La vista parziale può aggiungere più contenuti/riferimenti di script, ecc. Ottenere i dati aggiungerà una richiesta di roundtrip e fino ad allora la mia pagina non funzionerà! – Kay