2012-08-22 8 views
5

Ho controllato alcune delle nuove funzionalità per Web Form in 4.5 e ho eseguito un blocco stradale con convalida non invadente.asp.net 4.5 Web Forms Validazione discreta jQuery Edizione

La convalida non intrusiva in Web Forms 4.5 dipende da jQuery e quando viene abilitata risulta un riferimento di script jQuery all'interno del modulo server nel corpo della pagina. Questo suona alla grande, e adoro il concetto. Funziona alla grande nelle demo che ho visto e la riduzione/pulizia del codice è una cosa meravigliosa.

Mi imbatto in problemi, tuttavia, quando lo abilito in progetti preesistenti. Il problema è che ho innumerevoli pagine e applicazioni che utilizzano jQuery per le interazioni lato client (l'interfaccia utente di jQuery è un tipico esempio) e in queste pagine ho un riferimento jQuery e un codice di accompagnamento nella sezione dell'intestazione della pagina. Quando la convalida non invadente è abilitata, il risultato è un secondo riferimento jQuery nella pagina e il javascript nell'intestazione si interrompe.

C'è un modo per me di dire al gestore di script che jQuery è già stato caricato nella pagina in modo che non venga aggiunto un secondo riferimento? In alternativa, c'è un modo per me di dire al gestore di script o al framework Web Forms di controllare la pagina per un riferimento jQuery esistente?

risposta

0

Sì, è possibile registrare un riferimento allo script (name = jquery) con ScriptManager che inturn dire al sistema di validazione discreto che jQuery è registrato e quanto si sta rendendo lo script te lo farà tutto il lavoro

+0

E come aggiungerebbe un riferimento simile? Quando aggiungo il markup, ricevo comunque l'errore. Se aggiungo uno in global.asax, devo specificare un percorso ... – Lodewijk

8

Sfortunatamente è richiesto ScriptResourceMapping. Tuttavia, con un po 'di lavoro puoi rimuovere il riferimento da ScriptManager in modo che non renda nuovamente jQuery.

creare una classe che deriva da ScriptManager nel progetto web:

using System; 
using System.Linq; 
using System.Web.UI; 

namespace WebApplication46 
{ 
    public class CustomScriptManager : ScriptManager 
    { 
     protected override void OnInit(EventArgs e) 
     { 
      Page.PreRenderComplete += Page_PreRenderComplete; 
      base.OnInit(e); 
     } 

     private void Page_PreRenderComplete(object sender, EventArgs e) 
     { 
      var jqueryReferences = Scripts.Where(s => s.Name.Equals("jquery", StringComparison.OrdinalIgnoreCase)).ToList(); 
      if (jqueryReferences.Count > 0) 
      { 
       // Remove the jquery references as we're rendering it manually in the master page <head> 
       foreach (var reference in jqueryReferences) 
       { 
        Scripts.Remove(reference); 
       } 
      } 
     } 
    } 
} 

Avanti, configurare una voce tagMapping nel web.config in modo che ASP.NET utilizzerà la vostra abitudine ScriptManager al posto di quello in the box:

<system.web> 
    <pages> 
    <tagMapping> 
     <add tagType="System.Web.UI.ScriptManager" mappedTagType="WebApplication46.CustomScriptManager" /> 
    </tagMapping> 
    </pages> 
</system.web> 

Questo è tutto. Ora il tuo CustomScriptManager assicurerà che tutti i riferimenti jQuery vengano rimossi da se stessi prima che ScriptManager abbia la possibilità di avviare la sua logica di rendering e continuerai a soddisfare tutti i requisiti per il funzionamento di UnobtrusiveValidation (supponendo che tu abbia un riferimento a jQuery nel tag della tua pagina).

+0

Grazie per il tuo suggerimento, l'ho completamente perso quando lo hai postato. Basta dare un'altra occhiata ad alcune delle funzionalità 4.5. Ho provato il tuo suggerimento, testato in Firefox, Chrome e IE e ogni risultato è lo stesso - gli script di intestazione si interrompono a causa del secondo riferimento jquery. Sembra che non sarò in grado di utilizzare la convalida non invadente senza importanti revisioni delle mie app webforms. Mi piacerebbe trovare un modo per ignorare questo comportamento. Questo è possibile in un aggiornamento di webform?O dovremmo aspettare la prossima versione di asp.net? – John

+0

Voglio solo chiarire perché il mio commento sopra è fuorviante. Damian, la tua soluzione funziona perfettamente (il mio commento precedente proveniva da un precedente approccio che hai postato). L'ho usato in un'applicazione e ha risolto il mio problema. Mi piacerebbe ancora vedere una soluzione integrata per questo in una versione futura di WebForms, ma al posto di ciò, la soluzione è molto apprezzata. – John

7

Come Damian Edwards said, non riesci a rimuovere il riferimento, quindi la soluzione che ho seguito è stata la creazione di un riferimento jQuery falso che punta a un file JS vuoto. Ciò creerà comunque il tag script extra inevitabile nel tentativo di caricare jQuery ma non sarà una vera libreria jQuery, quindi non ci sarà alcun conflitto con il riferimento jQuery nel tuo head tag.

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     ScriptManager.ScriptResourceMapping.AddDefinition("jquery", new ScriptResourceDefinition 
     { 
      Path = "~/Scripts/empty-file.js" 
     }); 
    } 
} 
+0

non carino, ma fa il trucco, grazie! – Colin

+0

Mi piace perché risolve il problema in un colpo, in un punto. – Cesar

Problemi correlati