ScriptManager y ClientScript en ASP.NET Ajax

Uno de los cambios que se han dado dentro de asp.net ajax es la generación de javascript en el lado del servidor, y es que sucede que ahora uds. encontrarán van a encontrar los diversos métodos que se tienen dentro del “Page.ClientScript” tambien definidos dentro de la clase “Microsoft.Web.UI.ScriptManager”.

En si esto como que es un poco confuso, pongamos un ejemplo, que tal si Uds. Quisieran desarrollar un Custom Control en el cual tuvieran la necesidad de Registrar un Control Hidden, normalmente realizarían lo siguiente:

  1 Page.ClientScript.RegisterHiddenField(this.ID, “”);

Esa es la forma tradicional de registrar el Hidden, ahora si ese control es usada en una página aspx que se basa en postbacks funcionaria de manera correcta, pero que sucede si se usara en una página basada en partial postbacks, con asp.net ajax como motor asíncrono, pues la respuesta es sencilla, simplemente no generaría el control Hidden, asi que si están teniendo este pequeño problema no se preocupen aca tenemos una alternativa :)

Esto es debido a que si uds quieren utilizar estos métodos en una página basada en asp.net ajax deben usar los métodos que vienen dentro de “Microsoft.Web.UI.ScriptManager” ahora también recuerden que dentro de una página basada en ajax también existe la posibilidad de hacer postbacks, por lo tanto una posible solución basada en código sería la siguiente:


 

  1 if (Microsoft.Web.UI.ScriptManager.GetCurrent(this.Page) != null){
2 if (Microsoft.Web.UI.ScriptManager.GetCurrent(this.Page).IsInAsyncPostBack){
3 Microsoft.Web.UI.ScriptManager.RegisterHiddenField(this, this.ID, “”);
4 }
5 else{
6 Page.ClientScript.RegisterHiddenField(this.ID, “”);
7 }
8 }
9 else{
10 Page.ClientScript.RegisterHiddenField(this.ID, “”);
11 }


 


Lo que hacemos en este snippet es primero, verificar si existe algun control ScriptManager dentro de la página, de esta forma descartamos si estamos usando o no asp .net ajax, en caso no exista entonces no es una pagina aspx que use ajax, por consiguiente un simple Page.ClientScript.RegisterHiddenField estaría OK.

El otro caso es que si este usando un control ScriptManager, ya que esto nos obliga a verificar si esta en un postback normal o en un “partial postback”, para ello usamos la propiedad “IsInAsyncPostBack” del ScriptManager actual, si la respuesta es verdadera implica que estamos en un partial Postback por lo que para registrar el control Hidden ahora requerimos usar el método dentro de la clase ScriptManager, de la siguiente manera:
 

  1 Microsoft.Web.UI.ScriptManager.RegisterHiddenField(this, this.ID, “”);


En caso la respuesta sea incorrecta entonces solo usamos un simple Page.ClientScript.RegisterHiddenField.


 


Espero sea de utilidad para Uds. a mi me ayudo en el momento de migrar a la ultima version de asp.net ajax.

Saludos cordiales,

Ivan Mostacero.

http://www.msdnlive.net/

Validacion Modulo 10 para tarjetas de credito

Módulo 10 no es mas ni menos que un algoritmo usado para validar un sin número de numeros de identifcación, comunmente se la relaciona a tarjetas de crédito pero en perú también es usado en otros números de identifiación como por ejemplo en la C.C.I. (Código de cuenta interbancaria) que es brindada por la Cámara de Compensación Electrónica y que sirve como identificador único para la realización de transferencia entre cuentas de diferentes bancos de perú.

Este algoritmo fue creado por Hans Peter Luhn en IBM y es un algoritmo de dominio público, en si no es un algoritmo hash ni nada por estilo ( tampoco pretende serlo) sino simplemente sirve para evitar errores accidentales al usar estos identificadores.

Más información al respecto la tenemos en WikiPedia, con ejemplos tanto para la generación y validación, además les dejo otro algoritmo usado para el mismo fin por si necesiten usarlo:

  1 public static  bool ValidaModulo10(string strNumeroValidar)
2 {
3 strNumeroValidar = Regex.Replace(strNumeroValidar, @”[^0-9]”, “”);
4 int LongitudCadena = strNumeroValidar.Length;
5 int intImpar = 0;
6 int intUniforme = 0;
7
8 char[] arrNumero = new char[LongitudCadena];
9 arrNumero = strNumeroValidar.ToCharArray();
10 Array.Reverse(arrNumero, 0, LongitudCadena);
11 for (int i = 0; i < LongitudCadena; i++)
12 {
13 if (i % 2 == 0)
14 {
15 intImpar += (Convert.ToInt32(arrNumero.GetValue(i)) – 48);
16 }
17 else
18 {
19 int intTemp = (Convert.ToInt32(arrNumero[i]) – 48) * 2;
20 if (intTemp > 9)
21 {
22 intTemp = intTemp – 9;
23 }
24 intUniforme += intTemp;
25 }
26 }
27 if ((intImpar + intUniforme) % 10 == 0)
28 return true;
29 else
30 return false;
31 }


Espero les sea de ayuda,

Ivan Mostacero

http://www.msdnlive.net/