2012-08-22 15 views
5

He estado revisando algunas de las nuevas características para Web Forms en 4.5, y me he topado con un bloque de carreteras con una validación discreta.asp.net 4.5 Web Forms Validación no intrusiva jQuery Issue

La validación no intrusiva en Web Forms 4.5 depende de jQuery, y cuando está habilitada dará lugar a una referencia de script jQuery dentro del formulario del servidor en el cuerpo de la página. Esto suena genial, y me encanta el concepto. Funciona muy bien en las demostraciones que he visto, y la reducción/limpieza en el código es algo hermoso.

Tengo problemas, sin embargo, cuando habilito esto en proyectos preexistentes. El problema es que tengo un sinnúmero de páginas y aplicaciones que utilizan jQuery para las interacciones del lado del cliente (jQuery UI es un ejemplo típico), y en estas páginas tengo una referencia de jQuery y un código adjunto en la sección del encabezado de la página. Cuando la validación no intrusiva está habilitada, el resultado es una segunda referencia jQuery en la página y el javascript en el encabezado se rompe.

¿Hay alguna manera para que yo le diga al gestor de guiones que jQuery ya se ha cargado en la página para que no se agregue una segunda referencia? Alternativamente, ¿hay alguna manera de decirle al administrador de scripts o al marco de Formularios Web que verifiquen en la página una referencia de jQuery existente?

Respuesta

0

Sí se puede registrar una referencia de script (nombre = jQuery) con scriptmanager que le dirá inturn el sistema de validación discreta que se ha registrado en jQuery y puesto que se renderiza los guiones mismo que lo hará todo el trabajo

+0

¿Y cómo agregarías esa referencia? Cuando lo agrego en el marcado, sigo recibiendo el error. Si agrego uno en global.asax, tengo que especificar una ruta ... – Lodewijk

8

Desafortunadamente se requiere ScriptResourceMapping. Sin embargo, con un poco de trabajo puede eliminar la referencia del ScriptManager para que no vuelva a generar jQuery.

crear su propia clase que se deriva de ScriptManager en su proyecto 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); 
       } 
      } 
     } 
    } 
} 

A continuación, configurar una entrada tagMapping en su web.config para que ASP.NET utilizará su costumbre ScriptManager en lugar de la de la caja:

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

Eso es todo. Ahora su CustomScriptManager asegurará que todas las referencias de jQuery se eliminen de sí mismas antes de que ScriptManager tenga la oportunidad de iniciar su lógica de renderizado y usted seguirá cumpliendo todos los requisitos para que UnobtrusiveValidation funcione (suponiendo que tenga una referencia a jQuery en la etiqueta de su página).

+0

Gracias por su sugerencia, lo extrañé por completo cuando lo publicó. Solo echando otro vistazo a algunas de las características 4.5. Probé tu sugerencia, probada en Firefox, Chrome e IE, y cada resultado es el mismo: las secuencias de comandos del encabezado se rompen debido a la segunda referencia de jquery. Parece que no podré usar una validación discreta sin revisiones importantes en mis aplicaciones de formularios web. Me encantaría encontrar una manera de anular este comportamiento. ¿Es esto posible en una actualización de formularios web?¿O deberíamos esperar a la próxima versión de asp.net? – John

+0

Solo quiero aclarar porque mi comentario anterior es engañoso. Damian, tu solución funciona a la perfección (mi comentario anterior era de un enfoque anterior que publicaste). Lo he estado usando en una aplicación y resolvió mi problema. Todavía me gustaría ver una solución integrada para esto en una versión futura de WebForms, pero en lugar de eso, su solución es muy apreciada. – John

7

Como Damian Edwards said, parece que no puede eliminar la referencia, por lo que la solución que obtuve fue crear una referencia jQuery falsa que apunta a un archivo JS vacío. Eso creará la inevitable etiqueta de script adicional en un intento de cargar jQuery, pero no será una biblioteca jQuery real, por lo que no habrá conflicto con la referencia de jQuery en la etiqueta de la cabecera.

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

no es bonito, pero funciona, ¡gracias! – Colin

+0

Me gusta esto porque soluciona el problema de una vez, en un solo lugar. – Cesar

Cuestiones relacionadas