2016-07-02 4 views
6

Mam scenariusz, w którym chciałbym załadować skrypty w zależności od typu żądania. Na przykład, załóżmy, że mam ten kod:Skrypty sekcji lub zwykłe <script> w zależności od typu żądania

@section scripts { 
<script> 
    $('#tabsContainer').InitializeTabs(); 
</scripts> 
} 

ładuje się idealnie, gdy chcę załadować całą stronę. Jednak mam coś, w którym użytkownik może również załadować stronę częściowo. Scenariusz jest tak:

public ActionResult Page() { 
if (Request.IsAjax()) return PartialView(); 
return View() 
} 

Problem polega na tym, czy to jest załadowany częściowo, skrypt nie działa, ponieważ skrypty @section nie działa w częściowej. Jeśli umieściłem go poza skryptami sekcji, nie działa on w pełnym widoku, ponieważ mam swoje skrypty na dole i próbuje uruchomić skrypt przed załadowaniem rzeczywistych plików JavaScript.

Zastanawia mnie dobry sposób na wdrożenie tego. Mogę przenosić moje skrypty na górze strony i to powinno rozwiązać wszystkie problemy. Mógłbym też mieć 2 różne skrypty, ale to może oznaczać, że muszę napisać ten sam kod dwa razy.

Czy ktoś wie, w jaki sposób można to wdrożyć? Może helper HTML, który ładuje skrypt w skryptach @section {} lub w standardowych znacznikach skryptów w zależności od typu żądania?

Zasadniczo, co to jest właściwy sposób to napisać:

@if (!Request.IsAjaxRequest()) 
{ 
    <text> 
    @section scripts 
    { 
     <script> 
      $(function() { 
       $("#tabs").tabs(); 
      }); 
     </script> 
    } 
    </text> 
} 
else 
{ 
    <text> 
     <script> 
      $(function() { 
       $("#tabs").tabs(); 
       ga('set', 'page', '/new-page.html'); // Update Google Analytics 
      }); 
     </script> 
    </text> 
} 

Dzięki z góry za pomoc.

+3

Skrypty powinny ** ** nigdy być w podszablonów. Umieść swoje skrypty w widoku lub układzie –

+0

Chciałbym się nie zgodzić w tej sprawie. Jasne, zgadzam się, że powinny ** prawie nigdy ** być w częściowym widoku. Jednak mając _FullView_, który może być renderowany w _PartialView_, mam wrażenie, że może to być w porządku? Czy mógłbyś ewentualnie zdefiniować inny sposób, w jaki mogę $ ("# tabs") .Inicjalizuj() po załadowaniu widoku (czy jest pełny czy częściowy i oprócz metod, które napisałem powyżej)? – FerX32

+0

Dodano przykład, aby dalej zilustrować mój punkt widzenia. – FerX32

Odpowiedz

0

można po prostu sprawdzić, czy w widoku()

@if (Request.IsAjaxRequest()) 
{ 
<script> 
    alert('Partial view'); 
</script> 
} 
else 
{ 
<script> 
    alert('Main view'); 
</script> 
} 
+0

Wiem, ale oświadczyłem w swoim poście, że nie chciałbym mieć duplikatu tagu skryptu. – FerX32

0

Pomysł, który nie miałem okazję przetestować: przechowywać pewne informacje na temat tego, czy wniosek jest ajax zapytanie w widoku (np. w atrybucie danych), a następnie w twoim skrypcie przetestuj tę wartość i wykonaj odpowiednio.

Np .:

<body data-isajaxrequest="@Request.IsAjaxRequest()">...</body> 

A potem skrypt:

$(function() { 
    function InitializeTabs() { 
     $("#tabs").tabs(); 
     if ($("body").data("isajaxrequest")) { 
      // it's an ajax request 
     } else { 
      // not an ajax request 
      ga('set', 'page', '/new-page.html'); // Update Google Analytics 
     } 
    } 

    $('#tabsContainer').InitializeTabs(); 
}); 

Place logika, ile potrzeba, gdzie komentarze są. Rzeczywisty skrypt wejdzie w pełny widok. Jak wspomniał inny plakat, nie powinieneś mieć skryptów w częściowych widokach.

+0

Po raz kolejny wymaga to napisania zduplikowanej logiki skryptu. – FerX32

+0

Nie widząc tego, co jest w twoich funkcjach InitializeTabs(), trudno powiedzieć.Można podzielić logikę, która jest oddzielna od zapytania ajax i umieścić ją w środku if, a następnie wszystko, co jest wspólne poza instrukcją if. Na podstawie tego, co napisałeś w swoim poście, zaktualizowałem swój przykład. Tam nie ma duplikatu kodu. – mtaanquist

+0

Widzę, że ma sens, jednak pozostaje problem, że jeśli NIE jest to żądanie Ajax, to musi być uruchomiony w skryptach @section {}. Jest to bardziej do zrobienia, tworząc pomocnika MVC, jak sądzę, niż coś jest JS. – FerX32

0

Można spróbować natywną JavaScipt drogę do tego rozwiązania:

var myFunction = function() { 
 
    alert('myFunction called after 500ms.'); 
 
    // do a lot of stuff here 
 
} 
 

 
// and then call the function after the page is loaded 
 
// let's supose an half second later: 
 

 
setTimeout(myFunction, 500);

Powiązane problemy