c# - Validación no intrusiva de ASP.Net 2012 con jQuery
(12)
Estaba jugando con Visual Studio 2012 y creé una aplicación web ASP.Net vacía , cuando traté de agregar los controles de validador tradicionales a una nueva página, aparece este error:
WebForms UnobtrusiveValidationMode requiere un ScriptResourceMapping para ''jquery''. Agregue un ScriptResourceMapping llamado jquery (sensible a mayúsculas y minúsculas).
¿Cuáles son los pasos para arreglarlo?
Este es el marcado de mi página:
<asp:Panel runat="server" ID="pnlUsername" GroupingText="Username settings">
<div>
<asp:Label ID="usernameLabel" Text="Please enter your username" runat="server" AssociatedControlID="username" />
</div>
<div>
<asp:TextBox runat="server" ID="username" />
<asp:RequiredFieldValidator ErrorMessage="The username is required" ControlToValidate="username" runat="server" Text=" - Required" />
</div>
</asp:Panel>
Además de la requerida "jquery" ScriptResourceDefinition
en Global.asax (use sus propias rutas):
protected void Application_Start(object sender, EventArgs e)
{
ScriptManager.ScriptResourceMapping.AddDefinition(
"jquery",
new ScriptResourceDefinition
{
Path = "/static/scripts/jquery-1.8.3.min.js",
DebugPath = "/static/scripts/jquery-1.8.3.js",
CdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.min.js",
CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.js",
CdnSupportsSecureConnection = true,
LoadSuccessExpression = "jQuery"
});
}
Además, solo necesita agregar explícitamente "WebUIValidation.js" después de " ScriptReference
" ScriptReference
en ScriptManager
(la parte más importante):
<asp:ScriptManager runat="server" EnableScriptGlobalization="True" EnableCdn="True">
<Scripts>
<asp:ScriptReference Name="jquery" />
<asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" />
</Scripts>
</asp:ScriptManager>
Si lo agrega antes de "jquery", o si no agrega uno o ninguno de los dos ( ASP.Net
lo agregará automáticamente antes de "jquery"), la validación del cliente se romperá por completo:
No necesita ninguno de esos paquetes NuGet en absoluto, ni ningún ScriptReference
adicional (algunos de los cuales son solo duplicados, o incluso un ScriptReference
completamente innecesario, ya que ASP.Net
agrega automáticamente si es necesario) mencionados en su blog.
EDITAR: no es necesario que agregue explícitamente "WebForms.js" también (lo eliminó del ejemplo) - y si lo hace, su LoadSuccessExpression
será ignorado por alguna razón
Agregue una referencia a Microsoft.JScript
en su aplicación en su web.config
como se muestra a continuación:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5">
<assemblies>
<add assembly="Microsoft.JScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
<httpRuntime targetFramework="4.5"/>
</system.web>
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="none"/>
</appSettings>
</configuration>
En el "archivo de configuración" en cambio estas líneas:
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
por estas líneas:
<compilation debug="true" targetFramework="4.0" />
<httpRuntime targetFramework="4.0" />
Este error porque en la biblioteca de la versión 4.0 pertenecen a "asp: RequiredFieldValidator" existe pero en la biblioteca de la versión 4.5 no existe, por lo que debe agregar la biblioteca por su cuenta
En el Administrador de paquetes de Nuget, busque AspNet.ScriptManager.jQuery en lugar de jquery. De esta manera, no tendrá que establecer las asignaciones usted mismo y el proyecto funcionará con el clic de una instalación simple.
O deshabilite la validación discreta agregando esta línea a la etiqueta de configuración del archivo web.config en el proyecto.
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
Esta es la respuesta oficial de Microsoft de los foros de MS Connect . Estoy copiando el texto relevante a continuación:
Cuando se apunta a .NET 4.5, la validación no intrusiva está habilitada de forma predeterminada. Necesitas tener jQuery en tu proyecto y tener algo como esto en Global.asax para registrar jQuery correctamente:
ScriptManager.ScriptResourceMapping.AddDefinition("jquery",
new ScriptResourceDefinition {
Path = "~/scripts/jquery-1.4.1.min.js",
DebugPath = "~/scripts/jquery-1.4.1.js",
CdnPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.1.min.js",
CdnDebugPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.1.js"
});
Reemplazar la versión de jQuery con la versión que está utilizando.
También puede desactivar esta nueva función en web.config eliminando la siguiente línea:
<add key="ValidationSettings:UnobtrusiveValidationMode" value="WebForms" />
Más información sobre ValidationSettings:UnobtrusiveValidationMode
Especifica cómo ASP.NET permite globalmente que los controles del validador incorporados utilicen JavaScript discreto para la lógica de validación del lado del cliente.
Tipo: Modalidad de validación no intrusiva
Valor predeterminado: ninguno
Observaciones: si este valor de clave se establece en "Ninguno" [predeterminado], la aplicación ASP.NET usará el comportamiento previo a 4.5 (JavaScript en línea en las páginas) para la lógica de validación del lado del cliente. Si este valor de clave se establece en "WebForms" , ASP.NET utiliza atributos de datos HTML5 y JavaScript enlazado tarde desde una referencia de script añadida para la lógica de validación del lado del cliente.
Ejemplo:
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>
Parece que hay mucha información incorrecta sobre ValidationSettings: UnobtrusiveValidationMode value. Para deshabilitarlo , debe hacer lo siguiente.
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
La palabra None, not WebForms debe usarse para deshabilitar esta característica.
Simplemente copie y pegue cualquier archivo JQuery en su proyecto y agregue un archivo Global.asax
y modifíquelo de la siguiente manera:
Solo pego el archivo JQuery en mi proyecto y agrego una referencia en el archivo Global.asax:
protected void Application_Start(object sender, EventArgs e)
{
ScriptManager.ScriptResourceMapping.AddDefinition(
"jquery",
new ScriptResourceDefinition
{
Path = "~/jquery-1.10.2.js",
DebugPath = "~/jquery-1.10.2.js",
CdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.10.2.min.js",
CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.10.2.js",
CdnSupportsSecureConnection = true,
LoadSuccessExpression = "jQuery"
});
}
Sugiero a cambio estas líneas
<div>
<asp:TextBox runat="server" ID="username" />
<asp:RequiredFieldValidator ErrorMessage="The username is required" ControlToValidate="username" runat="server" Text=" - Required" />
</div>
por esta linea
<div>
<asp:TextBox runat="server" ID="username" required />
</div>
Todo el error del validador ha sido resuelto por este
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None"/>
El error debe desaparecer, disfrutar ...
en Visual Studio 2012 en web.config cambie el targetFramework = 4.5 a targetFramework = 4.0
<add key="ValidationSettings:UnobtrusiveValidationMode" value="WebForms" />
esta línea no estaba en mi WebConfig así que: Resolví esto simplemente degradando la versión .Net de destino a 4.0 :)