viernes, 10 de diciembre de 2010

Cómo validar el NIF mediante los controles de validación de ASP.NET

Ayer publiqué una entrada con un script que servía para validar el NIF de una persona mediante un javascript genérico. Veamos hoy cómo hacerlo utilizando controles de validación específicos de .NET.
En primer lugar, se crea un web site y dentro de éste un archivo aspx, por ejemplo, Default.aspx. Dentro de Default.aspx se inserta un formulario (lo normal es que venga por defecto) y en él se incluye una etiqueta (label) y un campo de texto (edit), por ejemplo como sigue:

<asp:Label ID="etiquetaNIF" runat="server" Text="NIF:"
AssociatedControlID="textoNIF"></asp:Label>
<asp:TextBox ID="textoNIF" runat="server" />

A continuación se añade un control de validación. Dado que el DNI es un tipo de validación muy específica que no puede validarse mediante expresiones regulares (recuerdo que la letra se calcula a partir de dividir el número en 23) debemos utilizar un Custom Validator, que añadiremos a continuación de lo anterior:
<asp:CustomValidator ID="CustomValidatorNIF"
runat="server" ErrorMessage="NIF incorrecto"
ControlToValidate="textoNIF" 
ClientValidationFunction="validanif" />
Como puede verse, los aspectos fundamentales son:
  • El ID: debe asignarse un id también al control de validación
  • Runat: debe asignarse al servidor
  • ErrorMessage: es el mensaje que aparecerá cuando la validación falle
  • ControlToValidate: el control a validar, en este caso textoNIF
  • ClientValidationFunction: validanif
  • OnServerValidate: En este caso no se ha utilizado un manejador de evento del lado del servidor porque el ejemplo está centrado en la parte del cliente, pero por motivos de seguridad se recomienda validar SIEMPRE en el lado del servidor las entradas de los usuarios

A continuación sólo nos falta añadir la función validanif al javascript de la página. Se recomienda que en un fichero externo y por los métodos habituales a tal efecto. El resultado sería:
///Calcula la letra del nif a partir del número
 function letranif(numero)
 {
  aLetras = new Array();
  aLetras[0] = "T" ;aLetras[1] = "R" ;aLetras[2] = "W" ;
  aLetras[3] = "A" ;aLetras[4] = "G" ;aLetras[5] = "M" ;
  aLetras[6] = "Y" ;aLetras[7] = "F" ;aLetras[8] = "P" ;
  aLetras[9] = "D" ;aLetras[10] = "X" ;aLetras[11] = "B" ;
  aLetras[12] = "N" ;aLetras[13] = "J" ;aLetras[14] = "Z" ;
  aLetras[15] = "S" ;aLetras[16] = "Q" ;aLetras[17] = "V" ;
  aLetras[18] = "H" ;aLetras[19] = "L" ;aLetras[20] = "C" ;
  aLetras[21] = "K" ;aLetras[22] = "E" ;   
  return aLetras[numero%23];
 }
 
 ///Lleva a cabo la validación del nif
 function validanif(source, args)
 {
  //Validación básica de formato
  var validformat = /^\d{8}([A-Z]|[a-z])$/;
  var numero;
  
  if (!validformat.test(args.Value))
  {
   args.IsValid = false;
   return;
  } 
   
  //Entrando en detalle
  numero = parseInt(args.Value.substring(0,8));
  
  //Si no es un número dar error
  if (isNaN(numero))
  {
   args.IsValid = false;
   return;
  }
   
  //Se comparan ambos resultados para validarlos
  if (letranif(numero)==args.Value.substring(8,9).toUpperCase())
   args.IsValid = true;
  else
   args.IsValid = false;
 } 

Como puede verse prácticamente planchado al método de ayer. La única peculiaridad a comentar es que se valida la letra tanto si es minúscula como si es mayúscula, aspecto a considerar según la aplicación.

No hay comentarios:

Publicar un comentario