scriptresourcemapping script resource net for error aspnethidden asp jquery asp.net webforms asp.net-4.5

jquery - for - scriptresourcemapping error in asp net



asp.net 4.5 Web Forms ValidaciĆ³n no intrusiva jQuery Issue (3)

Sí, puede registrar una referencia de script (name = jquery) con scriptmanager, que a su vez le informará al discreto sistema de validación que jquery está registrado y, dado que está renderizando los scripts usted mismo, todo funcionará

Estuve revisando algunas de las nuevas funciones para Web Forms en 4.5, y me encontré con un bloqueo de ruta con una validación discreta.

La validación discreta en Web Forms 4.5 depende de jQuery, y cuando está habilitada dará como resultado 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.

Sin embargo, tengo problemas cuando lo habilito 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?


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

Cree 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, configure una entrada tagMapping en su web.config para que ASP.NET use su ScriptManager personalizado en lugar del que está en la caja:

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

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


Como dijo Damian Edwards , parece que no se 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 jQuery en la etiqueta head.

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