UnobtrusiveValidationMode en ASP .NET

Error relativo a validación no-intrusiva (unobtrusive validation) que aparece en aplicaciones web que utilizan Asp .NET 4.5 o posterior creadas en Visual Studio

Al ejecutar la aplicación Asp .NET creada en Visual Studio puede aparecer el error que se muestra en la imagen. La causa radica en el cambio del modo de validación que apareció con la versión 4.5 de Asp .NET, llamada unobtrusive validation y que ha sido traducida como validación no-intrusiva. José Manuel Alarcón tiene un artículo con una explicación excelente sobre este asunto en su blog.

Si la aplicación de Visual Studio utiliza Asp .NET anterior a 4.5 el error no aparece porque se emplea el modo tradicional de validación. Pero si utiliza 4.5 o posterior el error puede aparecer al compilar una página aspx con controles de validación. El caso típico es la migración de un proyecto pre 4.5 abriéndolo con la versión actual de Visual Studio y asignando al proyecto la versión 4.5 o posterior de Asp .NET.
Si se crea un nuevo proyecto web con las versiones recientes de Visual Studio a partir de alguna de las plantillas (es decir, el proyecto no se crea de tipo vacío) el error tampoco aparece porque Visual Studio configura todo lo necesario para usar el modo nuevo de validación, instalando paquetes auxiliares entre los que se encuentra AspNet.ScriptManager.jQuery que en su código de inicialización añade las bibliotecas necesarias con ScriptResourceMapping para incluir jQuery.

NOTA: la versión de Asp .NET coincide con la de .NET Framework.

Para solucionar este error hay 2 enfoques diferentes, deshabilitar la validación no-intrusiva regresando al modo tradicional o habilitar correctamente la validación no-intrusiva.

Deshabilitar la validación no-intrusiva

Se puede hacer de forma muy sencilla tanto para páginas independientes como para toda la aplicación web. Para la aplicación entera: añadir en el nodo appSettings del archivo Web.config la línea

<appSettings>
	<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>

Para una página concreta: se puede hacer de 2 formas diferentes, añadir en la declaración de página la propiedad UnobtrusiveValidationMode=¨None¨ o añadirla al evento Load de la página.

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="validar1.aspx.vb" Inherits="validarvb1.validar1" UnobtrusiveValidationMode="None" %>
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
	Page.UnobtrusiveValidationMode = System.Web.UI.UnobtrusiveValidationMode.None
End Sub

Habilitar la validación no-intrusiva

En mi caso el error se presentó al adaptar un proyecto creado hace tiempo con una versión antigua de Asp .NET a la versión más nueva. La solución propuesta por José Manuel Alarcón no ha funcionado. A continuación comento las modificaciones que han hecho desaparecer el error.

1.

Colocar en la carpeta Scripts 2 archivos: jquery-3.4.1.js (versión de desarrollo) y jquery-3.4.1.min.js (versión de producción) descargados desde www.jquery.com, son imprescindibles para que la validación no-intrusiva funcione adecuadamente.

2.

Registrar un objeto ScriptManager en la página aspx con controles de validación, este bloque ha de ser el primer texto después de la etiqueta FORM.

<asp:ScriptManager runat="server">
<Scripts>
    <asp:ScriptReference Name="jquery" />
</Scripts>
</asp:ScriptManager>

3.

Instalar desde NuGet varios paquetes en la carpeta packages:

  • AspNet.ScriptManager.jQuery.3.4.1
  • jQuery.3.4.1
  • Microsoft.AspNet.FriendlyUrls.Core.1.0.2
  • Microsoft.AspNet.FriendlyUrls.Core.es.1.0.2

4.

Añadir en al carpeta App_Start un archivo RouteConfig.vb para configurar el modo de redireccionamiento de rutas y otros parámetros.

Imports Microsoft.AspNet.FriendlyUrls

Public Module RouteConfig
    Sub RegisterRoutes(ByVal routes As RouteCollection)
        Dim settings As FriendlyUrlSettings = New FriendlyUrlSettings() With {
            .AutoRedirectMode = RedirectMode.Permanent
        }
        routes.EnableFriendlyUrls(settings)
    End Sub
End Module

La clase RouteConfig encapsula la funcionalidad relacionada con la redirección de peticiones y se localiza en App_Start/RouteConfig.vb o RouteConfig.cs o ambos. Este fichero contiene las operaciones que la aplicación ha de realizar al iniciarse, previas a cualquier petición que pueda recibir. Entre esas operaciones se encuentra la posibilidad de indicarle cómo se realizarán las redirecciones de las peticiones HTTP.

5.

Incluir un archivo packages.config en la raíz del proyecto con referencias a los paquetes instalados.

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AspNet.ScriptManager.jQuery" version="3.4.1" targetFramework="net472" />
  <package id="jQuery" version="3.4.1" targetFramework="net472" />
  <package id="Microsoft.AspNet.FriendlyUrls.Core" version="1.0.2" targetFramework="net472" />
  <package id="Microsoft.AspNet.FriendlyUrls.Core.es" version="1.0.2" targetFramework="net472" />
</packages>

6.

Registrar en el evento Application_Start del archivo Global.asax las rutas y modo de redireccionamiento definidos en el archivo RouteConfig.

Public Class Global_asax
    Inherits HttpApplication

    Sub Application_Start(sender As Object, e As EventArgs)
        RouteConfig.RegisterRoutes(RouteTable.Routes)
    End Sub
End Class

La clase HttpApplication define los métodos, propiedades y eventos comunes a todos los objetos de aplicación. Esta clase es la clase base para las aplicaciones que están definidas por el usuario en el archivo Global.asax.

Con estas 6 modificaciones realizadas sobre un proyecto antiguo el error «UnobtrusiveValidationMode» ha desaparecido y la aplicación parece funcionar bien con el modo nuevo de validación.

Al final de este artículo tienes enlace para descargar una aplicación de ejemplo con estas modificaciones realizadas, es el que tiene este texto: ¨creada en Visual Studio utilizando validación de Asp .NET 4.5 o posterior¨.

NOTA: la aplicación desarrollada fuera de Visual Studio para ser probada con IIS en el servidor local no manifiesta este error, al menos en mi caso, solamente lo hace la que se crea desde Visual Studio.

2 comentarios en «UnobtrusiveValidationMode en ASP .NET»

Deja un comentario