2012-10-11 14 views
5

Czy można dołączyć kod HTML do istniejącej sekcji maszynki do golenia?Dołącz kod HTML do istniejącej sekcji Razor

Poniżej jest mój scenariusz:

Moja _layout.cshtml zawiera coś takiego:

@RenderSection("BottomSection", required: false) 

iw jednym z widoku - _article.cshtml, mam określony odcinek jak poniżej:

@section BottomSection 
{ 
<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) 
} 

i w częściowym widoku nazwie _counter.cshtml, który stosuje się w wyżej widzenia; Chciałbym dodać więcej kodu HTML do tej samej sekcji, tj. BottomSection.

Próbowałem ponownie deklarując sekcję BottomSection w częściowym widokiem:

@section BottomSection{ 
<text>More data</text> 
} 

Ale nie udało się.

Czy istnieje jakiś sposób, aby to osiągnąć - dynamicznie dołączyć więcej kodu do już zdefiniowanej sekcji brzytwa w MVC 4? Należy pamiętać, że widok częściowy nie oczekuje żadnych danych z widoku/modelu nadrzędnego. I używam MVC 4 z .Net Framework 4.0/VS2010.

Odpowiedz

-3

Korzystając z Ajaksu, możesz załadować częściowy widok i renderować w docelowym oddziale.

Spróbuj użyć jquery ajax

 $.ajax({ 
      type: 'GET', 
      url: '@Url.Action("Action","Controller")', 
      cache: false, 
      timeout: 20000, 
      contentType: "application/json; charset=utf-8", 
      success: function (_results) { 
       $("#TargetDiv").html(_results); 
      }, 
      error: function (_results) { 

      } 
     }); 
+0

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

+0

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

-2

Może ja nie rozumiem pytanie, ale dlaczego dont za pomocą zagnieżdżonych widoki częściowe ???

na przykład:

PartialView1

`<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) 
@{Html.RenderPartial("PartialView2",Model.ExtraStuff);}` 

PartialView2

`<text>More data</text>` 
+0

Po wielu widokach częściowych problem zostanie rozwiązany. Ale skończy się to dla mnie mnóstwem plików częściowego widoku - przeciwstawiając się celowi dynamicznego podejścia. – Kay

0

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") 
+0

Korzystanie z System.Web.HttpContext.Current.Items zamiast TempData może być jeszcze lepszym pomysłem, ponieważ TempData działa tak długo, jak go nie czytasz, co może prowadzić do dziwnych sytuacji (takich jak sekcja, której nie renderujesz na jednej stronie, renderuje na innym). – jahu

Powiązane problemy