2013-03-11 13 views
30

Utworzono MVC 4 przy użyciu domyślnego szablonu, gdzie @Script.Render(~"bundles/jquery") jest wywoływana po @RenderBody(). Zgodnie z postem this jest to zalecana kolejność wykonywania, aby zapobiec ładowaniu skryptów w celu zablokowania renderowania strony.Prawidłowe miejsce do załadowania jQuery w widoku układu MVC

Chcę dodać małe wywołanie jQuery w moim widoku lub mojej sekcji RenderBody(). Wygląda to tak, na szczycie moim zdaniem:

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

to jednak zawsze będzie rzucać Błąd Error: '$' is undefined ponieważ jQuery nie jest załadowany aż po RenderBody().

Nie mogę sobie wyobrazić, że to nowy problem, wydaje się dość powszechnym zadaniem ... Jakieś sugestie, jak należy to załatwić?

Dla porównania, tutaj jest gdzie jQuery jest załadowany:

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

Edycja

skończyło się przesuwając skrypt powyżej w moim pliku scripts.js i załadowano go poniżej jQuery na stronie układu, tak:

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

I HTML:

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

Poza tym wciąż wydaje się nie tak, jak teraz skrypty będą musieli ładować dla każdej strony, która korzysta z widoku układu głównego. Działa, ale czy to najlepszy sposób?

Odpowiedz

72

Tworzenie nowego MyScripts sekcja poniżej wszystkich innych skryptów bibliotecznych

_Layout

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

MyView

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

Teraz niestandardowe skrypty strona ładowane tylko raz po jQuery jest załadowany.

+18

Lub po prostu użyj istniejącej sekcji "skrypty". –

+1

Tak, zrobiła to sekcja "skrypty". Nie wiedziałem dokładnie, co to robi, dziękuję za lekcję. To zadziałało. – Tom

+1

@ChrisPratt tak, to z pewnością prawda. Ale lubię używać wstępnie zdefiniowanej sekcji "skrypty" dla bibliotek, które zawierają skrypt z pojedynczą linią, więc stworzyłem nową sekcję specjalnie dla skryptu, który wypisałbym tylko na tej stronie. W rzeczywistości, zrobiłbym przepustkę do refaktora, by wyodrębnić "MyScripts" do oddzielnego pliku js, aby skorzystać z pakowania. – Jasen

Powiązane problemy