2009-06-23 19 views
6

Ricevo un errore di runtime di Microsoft JScript: errore "Sys" non definito "su una delle mie pagine in un'applicazione MVC quando tento una chiamata AJAX. La chiamata AJAX è composta da una vista parziale che è incorporata in più di una pagina. Funziona bene su tutte le pagine tranne una. Ho letto i post che puntano alle impostazioni del file web.config e ai mapping di .axd come possibili soluzioni, ma l'applicazione è configurata correttamente nel web.config e anche i mapping .axd sono corretti in IIS. Inoltre funziona bene su tutte le pagine che utilizzano questa vista parziale tranne una. Funziona come se le librerie AJAX non stessero caricando per questa pagina.ASP.NET MVC AJAX Sys non definito errore

I riferimenti ai file di script si trovano nel file site.master condiviso. Tutte le pagine, inclusa quella che non funziona, fanno riferimento alla stessa pagina master.

Qualche idea? Ho lavorato su questo per due giorni. Grazie.

MODIFICA: come ha sottolineato Sam di seguito, sembrerebbe che la chiamata AJAX stia sparando prima che le librerie AJAX abbiano la possibilità di caricarsi. Tuttavia, la chiamata AJAX viene attivata da un pulsante di invio molto tempo dopo il rendering della pagina, pertanto le librerie AJAX hanno avuto tutto il tempo necessario per caricarsi, mi spiace non aver fornito abbastanza informazioni la prima volta.

risposta

3

Carica la pagina in Firefox, quindi usa Firebug per ispezionare la pagina: sarai in grado di vedere tutti i singoli script caricati, oltre a tutte le richieste di rete che sono state emesse e se ci sono riusciti o meno. Questo è meglio che provare a risolvere i problemi dal punto di vista del server.

Se si utilizza IE8, è possibile utilizzare la finestra degli strumenti di sviluppo, ma penso che Firebug sia migliore: entrambi gli strumenti supportano tuttavia il debug di JavaScript.

Il problema più probabile è che si sta eseguendo script nella vista parziale prima che gli script da cui dipenda abbiano la possibilità di caricarsi - assicurarsi che qualsiasi chiamata di script che si ha all'interno della vista parziale venga eseguita solo una volta la pagina ha caricato, e non immediatamente durante il caricamento.

+0

@Sam - Ho già dato un'occhiata con firebug e posso vedere che entrambe le librerie Ajax vengono caricate quando faccio clic sulla scheda degli script. Comunque non sono così familiare con Firebug, quindi potrei mancare qualcosa. Ho usato molto il violinista, quindi ne darò un'occhiata domani quando arrivo in ufficio per verificare che la chiamata per gli script non stia fallendo. Poiché la chiamata ajax viene attivata da un pulsante di invio molto tempo dopo il rendering della pagina, escludo che gli script non abbiano avuto la possibilità di caricare. Grazie. – cnaegle

+0

@ Sam - ha dato un'occhiata a Fiddler questa mattina e indovina un po '? Il percorso del file di script non è corretto solo per quella pagina. Non so ancora perché, ma quando inserisco un percorso completo per gli script, la pagina funziona perfettamente. Grazie, sto contrassegnando la tua risposta come corretta dal momento che mi ha mandato sulla strada giusta - usando uno strumento che mi avrebbe detto quello che dovevo sapere due giorni fa :) – cnaegle

0

Aggiungi a web.cofig nella sezione:

<remove verb="*" path="*.asmx"/> 

<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 

<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 

<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/> 

<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 

+0

Come detto sopra, il file web.config è configurato correttamente. – cnaegle

16

Solo nel caso ... utilizzare il seguente percorso per evitare problemi

<script src="<%= Url.Content("~/Scripts/MicrosoftAjax.debug.js") %>" 
    type="text/javascript"></script> 
<script src="<%= Url.Content("~/Scripts/MicrosoftMvcAjax.debug.js") %>" 
    type="text/javascript"></script> 

Fonte: http://msdn.microsoft.com/en-us/library/dd381533.aspx

Grazie, Arty

+1

Questa sembra essere la prima cosa che le persone dovrebbero verificare, indipendentemente dal fatto che includano i file MicrosoftAjax.js e MicrosoftMvcAjax.js –

+0

. ha funzionato –

0

quanto riguarda la tua risposta a Sam, una cosa che ho notato in un sacco di applicazioni MVC è che la gente non sa come affrontare con l'ambiguità dei percorsi relativi e dell'applicazione/runtime. Ad esempio, la riscrittura dell'URL garantisce pressoché che una determinata pagina possa apparire a profondità diverse da quelle previste, quindi ../../images punterà da un'altra parte a seconda che si guardi allo /products/widget o /products/widget/12345, anche se la vista potrebbe essere la stessa.Come ha sottolineato Arty, il modo migliore per affrontarlo è lasciare che il motore esegua il lavoro per te utilizzando un'utilità URL e percorsi relativi all'applicazione che verranno riparati dall'applicazione indipendentemente dal contesto.

0

Ho anche trovato che l'utilizzo dei seguenti lavori con ASP.NET MVC2.

Invece di usare MicrosoftMvcAjax.js, si utilizza MicrosoftMvcValidation.js

Spero che questo aiuti qualcuno.

2

Tutti i casi di cui sopra sono ok. Ma a volte lo sviluppatore dimentica di aggiungere file javascript per ajax. Quindi controlla anche quello.

16

Nel web.config aggiungere la seguente riga di codice sotto appsettings tag:

<add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
+0

Per qualche motivo durante l'installazione del pacchetto nuget per Microsoft UnoBtrusive Ajax questo non è stato aggiunto al mio Web.Config. Grazie per il consiglio. – coryrwest

+1

Era questo! Ho passato tutta la mattinata su questo .. –

+0

Errore più comune. Grazie! – mihkov

0

Fondamentalmente si potrebbe mancare: MicrosoftMvcAjax., MicrosoftMvcValidation.debug e MicrosoftMvcValidation riferimenti ai file JS.

fare i passi in basso:

  1. PM> Install-Package MicrosoftAjax

  2. PM> Install-Package MicrosoftMvcAjax.Mvc5

  3. includerli nella bundleconfig come di seguito:

    bundles.Add(new ScriptBundle("~/bundles/mvcFoolProof") 
         .Include("~/Scripts/MicrosoftAjax*", 
           "~/Scripts/MicrosoftMvcAjax*", 
           "~/Scripts/MicrosoftMvcValidation*", 
           "~/Scripts/mvcfoolproof*", 
           "~/Scripts/MvcFoolproofJQueryValidation*", 
           "~/Scripts/MvcFoolproofValidation*")); 
    

Ora dovrebbe funzionare senza errori.