Acentos en Java Script alert y confirm

Suele ser una pregunta frecuente en foros y newsgroup y la solución es sencilla. Cuando mostramos letras acentuadas,la letra ñ/Ñ en alertas javascript, en ciertas ocasiones y dependiendo de la codificación usada, utilización de AJAX, registrar scripts a través del ScriptManager en un UpdatePanel… suele verse un mensaje de este tipo:

confirm

La solución es utilizar unicode:

u00e1 -> á
u00e9 -> é
u00ed -> í
u00f3 -> ó
u00fa -> ú
u00c1 -> Á
u00c9 -> É
u00cd -> Í
u00d3 -> Ó
u00da -> Ú
u00f1 -> ñ
u00d1 -> Ñ

Y el resultado:

confirm2

Salu2

Dynamic Data Web Applications o como montar rápidamente una aplicación web con acceso a datos

Ayer en casa me decidí a realizar unos Labs con las ASP.NET 3.5 extensions de acceso dinámico a datos siguiendo los quickstarts en inglés disponibles en:


http://quickstarts.asp.net/3-5-extensions/dyndata/default.aspx


para probar eso de montarte una pequeña aplicación de mantenimiento de una base de datos sencilla en poco tiempo y pensé en crear un pequeño tutorial en español:


Lo primero que necesitamos es instalarnos las ASP.NET 3.5 Extensions Preview:


http://www.microsoft.com/downloads/details.aspx?FamilyId=A9C6BC06-B894-4B11-8300-35BD2F8FC908&displaylang=en


Una vez instaladas, creamos un proyecto Dynamic Data Web Application:


Sin nombre


Cuando se crea el proyecto y miramos su estructura, a primera vista llama la atención la carpeta App_Shared:


Sin nombre2


En la carpeta App_Shared se encuentran las diferentes templates de páginas y campos (Data Pages y Data Fields) e imagenes que sirven para construir las páginas dinámicas. Entre las templates de páginas tenemos:



  1. ListDetailsTemplate.aspx: Muestra la lista de filas de una tabla concreta y el detalle de sus elementos. Esta es la plantilla por defecto para todas las operaciones de datos (DynamicGridView + DynamicDetailsView).

  2. DetailsTemplate.aspx: Muestra el detalle de una fila de la tabla (DynamicDetailsView)

  3. ListTemplate.aspx: Muestra la lista de filas de una tabla concreta. Está pensada para trabajar junto con DetailsTemplate.

Una vez visto un poco por encima las diferentes templates vamos a hacer que todo esto funcione:


Lo primero es crearnos un archivo LINQ to SQL Classes de la base de datos Northwind que nos servirá como repositorio de nuestra aplicación:


Sin nombre3


Y por último sólo tenemos que actualizar el Web.Config para que nuestra aplicación lo consuma y para habilitar las plantillas dinámicas par que se generen de manera automática las páginas con los datos. Para ello abrimos el Web.Config y buscamos esta línea:



<dynamicData dataContextType=”” enableTemplates=”false”>

Y la actualizamos con esta información:



<dynamicData dataContextType=”Northwind.RAD.DynamicData.App_Code.NorthwindDataContext” 
    enableTemplates=”true”>

Por último sólo queda ver el resultado:


Sin nombre4


Las filas de la tabla:


Sin nombre5


Editando un registro:


Sin nombre6


Como podéis ver se tarda excaso un minutillo en montarse una aplicación para mantener una base datos, que por supuesto, esto no es una aplicación empresarial ni mucho menos pero que viene muy bien para cosillas pequeñas de mantenimiento y tampoco se necesitan unos conocimientos experimentados.


En la figura donde se muestran los datos de la tabla, llama la atención la marca amarilla sobre el strock. Eso se puede lograr creandonos nuestros propios Data fields, que en este caso resalta los productos que tienen un stock menor de 100 pero eso lo dejamos para el siguiente artículo.


Y no quería despedirme sin antes comentar que hoy han actualizado ASP.NET Dynamic Data Preview:


http://code.msdn.microsoft.com/dynamicdata


Salu2

Extendido el periodo de examenes beta 71-561 y 71-562

Pues eso, que acabo de leer mis feeds y me entero que han extendido el periodo de los examenes beta:

71-561:TS: Microsoft .NET Framework 3.5, ADO.NET Application Development

71-562: TS: Microsoft .NET 3.5, ASP.NET Application Development

Los códigos promocionales son:

70-561 – beta code = 561B1

70-562 – beta code = 562B1

Y para apuntarse:

Prometric: http://www.register.prometric.com/ClientInformation.asp

Así que ya sabéis, a probar suerte :)

Salu2

A property or indexer may not be passed as an out or ref parameter

Hoy, mi compañero de trabajo y yo estabamos dándole vueltas al por qué de este error en el compilador de C# y no en el de VB.NET. Mirando una buena explicación del por qué el compilador de C# no permite esto, he encontrado esta:

a.cs

class zzz
{
    public static void Main()
    {
        yyy a = new yyy();
        a.aa = 10;
        a.abc(ref a.aa);
    }
}
 
class yyy
{
    public int aa
    {
        get { return 0; }
        set { }
    }
 
    public void abc(ref int b)
    {
 
    }
} 

Compiler Error

a.cs(7,11): error CS0206: A property or indexer may not be passed as an out or ref parameter

If it walks like a duck, quacks like a duck, it’s a duck. A property looks and feels like a variable but it is actually a series of functions or to be technically correct, accessors. Only a storage or memory location can be passed as a ref or an out parameter. A property is not allocated any memory and thus cannot be used wherever a variable can be used. All the restrictions of static  apply to static properties too. The get accessor must terminate either in a return or a throw statement. Control cannot flow off the accessor body at the end. A set accessor is like a function that returns void and it has an implicit parameter value.

fuente original: http://www.vijaymukhi.com/documents/books/csadv/chap1.htm

Pero me picaba la curiosidad y he querido ver como lo trata el compilador de VB.NET (Que era la solución que pensabamos para C#):

Module Module1
    Sub Main()
        Dim a As New yyy()
        a.aa = 10
        yyy.abc(a.aa)
    End Sub
End Module
 
Class yyy
    Private _codigo As Integer
    Public Property aa() As Integer
        Get
            Return 0
        End Get
 
        Set(ByVal value As Integer)
            _codigo = value
        End Set
    End Property
 
    Public Shared Sub abc(ByRef b As Integer)
 
    End Sub
End Class

Visto con Reflector:

[STAThread]
public static void Main()
{
    yyy a = new yyy();
    a.aa = 10;
    yyy VB$t_ref$S0 = a;
    int VB$t_i4$S0 = VB$t_ref$S0.aa;
    yyy.abc(ref VB$t_i4$S0);
    VB$t_ref$S0.aa = VB$t_i4$S0;
}
 

Lo hace con una variable auxiliar del tipo de la propiedad :)

Cuanto menos curioso, ¿No?

Salu2

Integrando Microsoft CRM en nuestras aplicaciones Web

Vamos a ver como podemos integrar CRM en nuestras aplicaciones Web utilizando el SDK que nos brinda, que para este caso utilizaremos la fachada de Servicios Web, que en este caso son 2:


Crm Web Service


Metadata Web Service


Nosotros vamos a trabajar con el primero, que nos pemite obtener entidades, crearlas, actualizarlas, borrarlas y realizar consultas XML, que esto lo veremos en otra ocasión.


Lo primero que tenemos que saber es la URL del Web Service de CRM, algo como:


http://servidor:puerto/mscrmservices/2006/crmservice.asmx


y agregarla a nuestra aplicación. Una vez que pongamos la URL nos aparecerá la siguiente información:


crmsdkwebreference


Como podemos observar, nos muestra los métodos que soporta y una pequeña descripción sobre los mismos. Añadimos finalmente la referencia y ya estamos listos para picar algo de código.


En el ejemplo que es muestro a continuación, vamos a recuperar los datos de un cliente particular concreto. Antes de llamar la método que nos devolverá la entidad, es necesario presentar las credenciales al Servicio Web para que sepa quienes somos y nos permita ejecutar la consulta sino recibiremos un 401 Unauthorized…



protected void Page_Load(object sender, EventArgs e)
{
    CrmService service = new CrmService();
 
    string domain       = “xxxxxxxxx”;
    string userName     = “xxxxxxxxx”;
    string password     = “xxxxxxxxx”;
    string authScheme   = “Negotiate”;
 
    CredentialCache credentialCache = new CredentialCache();
    NetworkCredential credential = new NetworkCredential(userName, password, domain);
    credentialCache.Add(new Uri(service.Url), authScheme, credential);
 
    service.Credentials = credentialCache;
    service.PreAuthenticate = true;
 
    contact clienteParticular = 
        (contact)service.Retrieve(EntityName.contact.ToString(), 
                                  new Guid(“366deebb-8bcd-dc11-9bd4-0017a4a78956”), 
                                  new AllColumns());
 
    txtFirstName.Text = clienteParticular.firstname;
    txtLastName.Text = clienteParticular.lastname;
    txtTelephone.Text = clienteParticular.telephone1;
}

Al principio puede resultar confuso sino se conoce CRM, sobre todo su modelo de entidades, pero una vez que entendemos un poquillo estos conceptos no cuesta muho empezar a atacarlo.


En el siguiente artículo vamos a ver comor realizar consultas más complejas :)


Saludos