Nie wiem, jak dołączyć do rzeczy sekcjach (w rzeczywistości chciałbym wiedzieć, że ja), ale znam sztuczkę, która może dać podobny rezultat. Zamiast używania sekcji można użyć TempData. TempData jest bardzo podobny do ViewBag, ale po ustawieniu zmiennej, będzie tam żyć dla bieżącego użytkownika, dopóki ktoś nie spróbuje uzyskać do niego dostępu (może on przeżyć kilka kolejnych żądań dla bieżącego użytkownika, więc zaleca się szczególną ostrożność). Poniżej znajduje się przykład tego, jak można go użyć.
W układzie:
@Html.Raw(new MvcHtmlString((string)TempData["BottomSection"]));
W widoku:
@{
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;
}
W częściowym widokiem:
@{
var bottomSection = (string)TempData["BottomSection"];
if (bottomSection == null)
{
bottomSection = "";
}
bottomSection += "More data";
TempData["BottomSection"] = bottomSection;
}
ten można jeszcze poprawić, pisząc pomocnika dla tych odcinków pseudo i \ lub przesuwając zawartość sekcji osobnych części (patrz poniżej).
bottomSection += Html.Partial("_StuffToAddToSection").ToString();
klasa Pomocnik:
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);
}
}
Przykład zastosowania
w układzie dodatku:
@TempData.PseudoSection("BottomSection")
Biorąc:
@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>)
lub
@{
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>);
}
lub nawet
@TempData.AppendToPseudoSection("BottomSection", Html.Partial("BottomSectionScriptsAndStuff"))
A częściowy:
@TempData.AppendToPseudoSection("BottomSection", "More data")
Proszę powiedzieć, dlaczego to rozwiązanie jest błędne. Próbowałem tego samego dla dołączania nowo wygenerowanego html do już renderowanego widoku – amesh
Dziękuję za odpowiedź, ale nie jest to chciałem zrobić. Widok częściowy może dodać więcej referencji do treści/skryptu itp. Uzyskanie danych spowoduje dodanie żądania obiegu, a do tego czasu moja strona nie będzie działać! – Kay