2012-10-11 13 views
5

È possibile aggiungere il codice HTML a una sezione di rasoio esistente?Aggiungere codice HTML a una sezione Razor esistente

Qui di seguito è il mio scenario:

mio _layout.cshtml contiene qualcosa di simile:

@RenderSection("BottomSection", required: false) 

e in uno della vista - _article.cshtml, ho definito la sezione come di seguito:

@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) 
} 

e in una vista parziale denominata _counter.cshtml, che viene utilizzata dalla vista precedente; Vorrei aggiungere altro codice HTML alla stessa sezione, ad esempio, BottomSection.

Ho cercato dichiara nuovamente la sezione BottomSection nella vista parziale:

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

ma non ha funzionato.

C'è un modo per ottenere questo - aggiungere dinamicamente più codice a una sezione del rasoio già definita in MVC 4? Si prega di notare che la vista parziale non si aspetta alcun dato dalla vista genitore/modello. E sto usando MVC 4 con .Net Framework 4.0/VS2010.

risposta

-3

Utilizzando Ajax è possibile caricare la vista parziale e può eseguire il rendering nella divisione di destinazione.

Prova utilizzando 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

informi il motivo per cui questa soluzione è sbagliata. Ho provato lo stesso per accodare l'html appena generato alla vista già renderizzata – amesh

+0

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

-2

Forse io non capisco la tua domanda, ma perché voi non utilizzando nidificate vista parziale ???

ad esempio:

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

Avere più viste parziali risolverà il problema. Ma questo finirà per avere molti file di visualizzazione parziale per me - sfidando lo scopo dell'approccio dinamico. – Kay

0

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

Utilizzare System.Web.HttpContext.Current.Items al posto di TempData potrebbe essere un'idea ancora migliore, dato che TempData vive finché non lo leggi, il che può portare a situazioni strane (come una sezione che non hai reso su una pagina, esegue il rendering su un altro). – jahu