2016-07-02 34 views
6

Ho uno scenario in cui vorrei caricare gli script in base al tipo di richiesta. Ad esempio, supponiamo di avere questo codice:Section Script o normale <script> in base al tipo di richiesta

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

questo carica perfettamente bene quando voglio caricare l'intera pagina. Tuttavia, ho una cosa in cui l'utente può caricare anche parzialmente la pagina. Lo scenario è simile a questo:

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

Il problema è, se è caricata in parte, lo script non funziona perché gli script @section non funziona in parziale. Se lo metto fuori dagli script di sezione, non funziona a pieno schermo visto che ho i miei script in fondo, e sta cercando di eseguire lo script prima che vengano caricati i file JavaScript effettivi.

Mi chiedevo un buon modo per implementarlo. Posso spostare i miei script in cima alla pagina e questo dovrebbe risolvere tutti i problemi. Potrei anche avere 2 diversi script, ma questo potrebbe significare che devo scrivere lo stesso codice due volte.

Qualcuno sa un modo piacevole per implementare questo? Forse un helper HTML che carica lo script in @section scripts {} o in normali tag script a seconda del tipo di richiesta?

In sostanza, qual è il modo corretto di scrivere questo:

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

Grazie in anticipo per l'aiuto.

+3

Gli script dovrebbero ** non ** essere parziali. Metti i tuoi script nella vista o nel layout –

+0

Vorrei non essere d'accordo in questo caso. Certo, sono d'accordo che dovrebbero ** quasi mai ** essere in visione parziale. Tuttavia, avendo un _FullView_ che può essere visualizzato in _PartialView_, mi sembra che possa andare bene? Potresti forse definire un altro modo in cui posso $ ('# tabs'). Initialize() dopo che la vista è stata caricata (Se completa o parziale. E accanto ai metodi che ho postato sopra)? – FerX32

+0

Aggiunto un esempio per illustrare ulteriormente il mio punto. – FerX32

risposta

0

si può semplicemente verificare che, in vista()

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

Lo so ma ho dichiarato nel mio post che non mi piacerebbe avere un tag script duplicato. – FerX32

0

Un'idea, che non ho avuto la possibilità di prova: memorizzare alcune informazioni sulla necessità o meno la richiesta è una richiesta AJAX nella vista (es. in un attributo dati), e poi, nel tuo script, prova quel valore e fallo di conseguenza.

Es .:

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

E poi lo script:

$(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(); 
}); 

Luogo tua logica, se necessario, dove i commenti sono. Lo script effettivo andrebbe nella visualizzazione completa. Come menzionato in un altro poster, non dovresti avere script all'interno di viste parziali.

+0

Ancora una volta, questo mi impone di scrivere una logica di script duplicata. – FerX32

+0

Senza vedere ciò che è nelle funzioni InitializeTabs(), è difficile da dire.Potresti dividere la logica che è separata dalla richiesta di ajax e posizionarla all'interno di if, e quindi tutto ciò che è in comune al di fuori dell'istruzione if. Sulla base di ciò che hai scritto nel tuo post, ho aggiornato il mio esempio. Non ci sono codici duplicati lì. – mtaanquist

+0

Vedo che ha senso, tuttavia, il problema rimane che se NON è una richiesta Ajax, dovrebbe essere eseguito in script @section {}. Questo è più da fare per creare un helper MVC, credo, piuttosto che qualcosa è il JS. – FerX32

0

Si può provare maniera nativa JavaScipt a questa soluzione:

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);

Problemi correlati