Volcar un objeto complejo de memoria a XML

Dim writer As New XmlTextWriter(“c:\binary\proyectos\bticket\volcadoSesiones.xml”, System.Text.Encoding.UTF8)
writer.WriteStartDocument(True)
writer.Formatting = Formatting.Indented
writer.Indentation = 2
writer.WriteStartElement(“Sesiones”)
‘Dim lst = CallByName(ListaSesiones, ListaSesiones.GetType.Name, CallType.Get)
For Each objSesion As CSesionVenta In ListaSesiones
CrearNodo(Of CSesionVenta)(writer, objSesion.GetType.Name, objSesion)
Next

writer.WriteEndElement()
writer.WriteEndDocument()
writer.Close()

Shared Sub CrearNodo(Of T)(ByRef writer As XmlTextWriter, ByVal nombreNodo As String, ByVal objeto As T)
writer.WriteStartElement(nombreNodo)
Dim propertiesU = objeto.GetType().GetProperties(Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public)
For Each Prop As Reflection.PropertyInfo In propertiesU
If Prop.CanRead Then

Dim bEsLista As Boolean = Prop.PropertyType.Name.Contains(“List`1”)

Dim nombre As String

Dim valor As String
nombre = Prop.Name
Try
If Not bEsLista Then
Dim mbEsClase As Boolean = False
Dim lst = CallByName(objeto, nombre, CallType.Get)
mbEsClase = lst.GetType.Namespace.Contains(“bTicket”)
If Not mbEsClase Then
writer.WriteStartElement(nombre)
valor = lst
writer.WriteString(valor)
writer.WriteEndElement()
Else

‘writer.WriteStartElement(nombreU)

‘For Each obj In lst
CrearNodo(writer, nombre, lst)
‘Next

‘writer.WriteEndElement()
End If

Else

Dim lst = CallByName(objeto, nombre, CallType.Get)
writer.WriteStartElement(nombre)

For Each obj In lst
CrearNodo(writer, obj.GetType.Name, obj)
Next

writer.WriteEndElement()

End If

Catch ex As Exception
writer.WriteStartElement(nombre)
valor = “Nothing”
writer.WriteString(valor)
writer.WriteEndElement()
End Try

End If
Next

writer.WriteEndElement()

End Sub

Algoritmo para Validar RUT

Para validar de forma estricta el RUT, usado por ejemplo en Chile, que no permite ni puntos ni guiones, se pueden usar estos algoritmos. Los dejo en dos lenguajes javascript para validar en cliente y vb.net para validar en servidor.

 

function validar(codigo)
{
		var rut; //lng
		var bRet=false;
        var digitoControl="";//str

       try {

            bRet = false;
            codigo = codigo.toUpperCase().trim();

            var largo=parseInt(codigo.length,10);
			var ultimo=parseInt(largo-1,10);
            

            //Si tiene menos de 8 caractéres es incorrecto
            if (largo < 6 || largo > 12) { return false;}
			for(var i=0;i<ultimo;i++)
			{
				var c= codigo.charCodeAt(i);
				if (i<ultimo){if (c<48 || c>57){return false;}}
				else{if (c<48 && c>57 && c != 75){return false;}}
				
			}
           
			rut= codigo.substring(0,ultimo).toString();
            var digitoControlEsperado=codigo.substring(codigo.length-1, codigo.length).toString();
           
            digitoControl = RutDigito(rut).toString();

            if(digitoControl == digitoControlEsperado ){bRet=true;}

        }
		catch(err) {
					bRet = false;
		}
		return bRet

}

 function RutDigito(T) {
     var M=0,S=1;
     for(;T;T=Math.floor(T/10))
        S=(S+T%10*(9-M++%6))%11;
     return S?S-1:'K';
  }

Para validar con VB se puede usar este:

  Public Function VerificaRUTChile(ByVal codigo As String) As Boolean
        Dim rut As Long
        Dim bRet As Boolean
        Dim digitoControl As String

        Try

            bRet = False
            codigo = codigo.Trim.ToUpper

            Dim largo As Integer = codigo.Length
            Dim penultimo As Integer = largo - 2
            Dim ultimo As Integer = largo - 1

            'Si tiene menos de 8 caractéres es incorrecto
            If (largo < 6 Or largo > 12) Then Return False

            For i As Integer = 0 To ultimo
                Dim c As Char = CChar(codigo.Substring(i, 1))

                If i < ultimo Then
                    'Solo admite numeros antes del ultimo caracter
                    If Asc(c) < 48 Or Asc(c) > 57 Then Return False
                Else
                    'Solo admite numeros o K mayúscula en el digito de control.
                    If (Asc(c) < 48 And Asc(c) > 57) And (Asc(c) <> 75) Then Return False 'K
                End If

            Next

            rut = CType(codigo.Substring(0, codigo.Length - 1), Long)
            Dim digitoControlEsperado As String = Right(codigo, 1)

            digitoControl = RutDigito(rut)

            If digitoControl = digitoControlEsperado Then
                bRet = True
            End If

        Catch ex As Exception
            bRet = False


        End Try
        Return bRet

    End Function

    Private Function RutDigito(ByVal Rut As Long) As String
        Dim Digito As Long
        Dim Contador As Long
        Dim Multiplo As Long
        Dim Acumulador As Long

        Contador = 2
        Acumulador = 0
        While Rut <> 0
            Multiplo = (Rut Mod 10) * Contador
            Acumulador = Acumulador + Multiplo
            Rut = Rut \ 10
            Contador = Contador + 1
            If Contador = 8 Then
                Contador = 2
            End If
        End While
        Digito = 11 - (Acumulador Mod 11)
        RutDigito = CStr(Digito)
        If Digito = 10 Then RutDigito = "K"
        If Digito = 11 Then RutDigito = "0"
    End Function

Como hacer un response en ASP sin enviar toda la página.

Esto es especialmente útil en ajax, si queremos enviar y devolver rapidamente una variable al servidor y que la respuesta no nos envíe mas que un pequeño valor y no todo el código y cabeceras de la página.

Lo normal es que si haces simplemente un Response.Write(“Todo OK!”), si haces un alert con lo que te devuelve, verás que tienes todo el código de la página detrás del Todo OK. Si solo quieres que llegue el Todo OK, sin el resto del código tienes que enviar el mensaje inmediatamente (Flush) y despues completar la conexión y eliminar el contenido.

 

HttpContext.Current.Response.Write(cadena)
HttpContext.Current.Response.Flush()
HttpContext.Current.ApplicationInstance.CompleteRequest()
HttpContext.Current.Response.SuppressContent = True