2013-03-11 11 views
30

Ho creato un MVC 4 utilizzando il modello predefinito, dove @Script.Render(~"bundles/jquery") viene chiamato dopo @RenderBody(). In base al post this, questo è l'ordine di esecuzione consigliato per impedire il caricamento di script per bloccare il rendering della pagina.Posizione corretta per caricare jQuery in MVC Vista layout

Desidero aggiungere una piccola chiamata jQuery nella mia visualizzazione o la mia sezione RenderBody(). Ecco come si presenta, nella parte superiore del mio punto di vista:

<script type="text/javascript"> 
$(document).ready(function() 
{ 
    $("#eta_table").tablesorter({ 
     headers: { 
      0: { sorter: false } 
     } 
    }); 
}); 

Tuttavia, questo sarà sempre buttare l'errore Error: '$' is undefined perché jQuery non è caricato fino a dopo la RenderBody().

Non riesco a immaginare questo è un nuovo problema, sembra un compito abbastanza comune ... Qualche suggerimento su come questo dovrebbe essere gestito?

Per avere un riferimento, qui è dove il jQuery è caricato:

 @Scripts.Render("~/bundles/jquery") 
    @RenderSection("scripts", required: false) 
</body> 

Modifica

ho finito per spostare lo script sopra in mio file scripts.js, e caricai sotto jQuery nella pagina di layout, in questo modo:

  bundles.Add(new ScriptBundle("~/bundles/custom").Include(
        "~/Scripts/Custom/tablesorter.js", 
        "~/Scripts/Custom/scripts.js")); 

E il codice HTML:

 @Scripts.Render("~/bundles/jquery") 
    @Scripts.Render("~/bundles/custom") 
    @RenderSection("scripts", required: false) 
</body> 

Tranne questo sembra ancora sbagliata, come ora gli script sono costrette a caricare per ogni pagina che utilizza la visualizzazione Layout di master. Funziona, ma è questo il modo migliore?

risposta

72

Creare un nuovo myscripts sezione di seguito tutti gli altri script di libreria

_Layout

@Scripts.Render("~/bundles/jquery") 
@RenderSection("scripts", required: false) 
@RenderSection("MyScripts", required: false) 

MyView

@section MyScripts { 
    <script type="text/javascript"> 
     $("#eta_table"); 
     ... 
    </script> 
} 

Ora i vostri script di pagina personalizzati solo vengono caricati una volta dopo jQuery è stato caricato.

+18

O semplicemente utilizzare la sezione "script" esistente. –

+1

Sì, la sezione "scripts" lo ha fatto. Non sapevo esattamente cosa stesse facendo, grazie per la lezione. Questo ha funzionato. – Tom

+1

@ChrisPratt sì, è certamente vero. Ma mi piace usare la sezione "scripts" predefinita per le librerie che includono il rendering di script a riga singola, quindi ho creato la nuova sezione specificamente per lo script che avrei scritto solo su quella pagina. In effetti, farei un passaggio di refactoring per estrarre "MyScripts" in un file js separato per sfruttare il bundling. – Jasen

Problemi correlati