2013-03-11 9 views
30

Ich habe eine MVC 4 mit der Standardvorlage erstellt, wobei @Script.Render(~"bundles/jquery") nach @RenderBody() aufgerufen wird. Gemäß this post ist dies die empfohlene Ausführungsreihenfolge, um das Laden von Skripten zu verhindern, um das Rendern der Seite zu blockieren.Der richtige Ort zum Laden von jQuery in MVC Layoutansicht

Ich möchte einen kleinen jQuery-Aufruf in meiner Ansicht hinzufügen, oder meine RenderBody() Abschnitt. Es sieht so aus, an der Spitze meiner Ansicht:

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

Dies ist jedoch immer der Fehler werfen Error: '$' is undefined weil jQuery erst nach dem RenderBody() geladen wird.

Ich kann mir nicht vorstellen, dass dies ein neues Problem ist, es scheint wie eine ziemlich häufige Aufgabe ... Irgendwelche Vorschläge, wie dies behandelt werden sollte?

Als Referenz hier ist, wo die jQuery geladen wird:

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

bearbeiten

Ich landete das Skript bewegt oben in meine scripts.js-Datei, und lud sie in jQuery auf der Layout - Seite, so:

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

Und die HTML:

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

Außer diesem scheint immer noch falsch, wie jetzt die Skripte für jede Seite gehen zu müssen, laden, die die Master-Layout-Ansicht verwendet. Es funktioniert, aber ist das der beste Weg?

Antwort

72

Erstelle einen neuen Abschnitt myscripts unter allen anderen Bibliothek Skripte

_Layout

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

MyView

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

Jetzt nur Ihre eigene Seiten Skripte einmal geladen werden nach jQuery geladen wird.

+18

Oder verwenden Sie einfach den vorhandenen Abschnitt "scripts". –

+1

Yup, "Skripte" Abschnitt hat es getan. Ich wusste nicht genau, was das tat, danke für den Unterricht. Das hat funktioniert. – Tom

+1

@ChrisPratt ja, das ist sicherlich wahr. Aber ich verwende gerne den vordefinierten Abschnitt "scripts" für Bibliotheken, die Einzeilige Skript-Includes rendern, also habe ich den neuen Abschnitt speziell für das Skript erstellt, das ich nur auf dieser Seite schreiben würde. In der Tat würde ich einen Refactor-Pass machen, um "MyScripts" in eine separate js-Datei zu extrahieren, um die Bündelung zu nutzen. – Jasen

Verwandte Themen