[OffTopic] Barbie I Can Be… Computer Engineer Doll

Joder, me he quedado de piedra al ver esto:

La ostia:

  • Dressed in a funky tee with binary code design
  • Comes with Bluetooth headset, laptop bag, and pink laptop
  • Special code inside each package unlocks career-themed content online
  • Perfect for gadget girls

Lo próximo que será, Ken I can be… Scrum Master XDDD

http://shop.mattel.com/product/index.jsp?productId=4032107

Salu2

[Tips] JQuery validate y como deshabilitar la validación en algunos botones

Un Tip cortito, sí en una página ASP.NET tenemos varios botones que hacen submit (Por ejmplo por que tenemos varios controles de usuario) y queremos que un botón no lance la validación del formulario, basta con ponerle el atributo class a cancel:

btnDeleteComment.Attributes.Add("class" ,"cancel");

Un saludo

[ASP.NET] Simular un EmptyDataTemplate en un DataList

Como sabréis, este tipo de template no está disponible en el control DataList (El GridView sí dispone de esta plantilla EmptyDataTemplate) para mostrar un mensaje informandole al usuario que no hay registros. Así que vamos a ver como con unas lineas de código podemos simularla:

Yo en mi caso voy a utilizar el FooterTemplate del DataList como sí se tratase de mi EmptyDataTemplate:

<FooterTemplate>

    <asp:Label ID="lblNoRecords" 

               runat="server" 

               Visible="false" 

               Text="No hay comentarios. Sea usted el primero."></asp:Label>

</FooterTemplate>

Dentro del FooterTemplate, añado un Label que será el que muestre el mensaje en caso de no haber registros (En este caso concreto, sino hay comentarios).

Una vez hecho esto, vamos al evento ItemDataBound del control y controlamos que el ItemType es del tipo Footer. Sí es, comprobamos que el número de registros es 0 y accedemos al label para ponerlo visible:

/// <summary>

/// Handles the ItemDataBound event of the dlComments control.

/// </summary>

/// <param name="sender">The source of the event.</param>

/// <param name="e">The <see cref="System.Web.UI.WebControls.DataListItemEventArgs"/> 

/// instance containing the event data.</param>

protected void dlComments_ItemDataBound(object sender, DataListItemEventArgs e)

{

    if (e.Item.ItemType == ListItemType.Footer)

    {

        if (dlComments.Items.Count == 0)

        {

            Label lblNoRecords = e.Item.FindControl(ControlNames.LABEL_NORECORDS) as Label;

 

            if (lblNoRecords != null)

            {

                lblNoRecords.Visible = true;

            }

        }

    }

}

Con esto hemos conseguido simular dicha template.

Un saludo

[MOSS] Llamadas a métodos .NET desde un Xsl (ContentByQueryWebPart)

En ocasiones puede ser necesario que desde un Xsl tengamos que llamar a un método .NET. En mi caso era para parsear el valor de un campo que contiene un Xml.

Lo primero será crearnos una clase para definir los métodos que vamos a llamar desde nuestros Xsl:

public class XsltCustomFunctions

{

    #region Variables

 

    /// <summary>

    /// Singleton Instance

    /// </summary>

    static readonly XsltCustomFunctions instance = new XsltCustomFunctions();

 

    #endregion

 

    #region Properties

 

    /// <summary>

    /// Gets the instance.

    /// </summary>

    /// <value>The instance.</value>

    public static XsltCustomFunctions Instance

    {

        get

        {

            return instance;

        }

    }

 

    #endregion

 

    #region Constructor

 

    /// <summary>

    /// Initializes the <see cref="XsltCustomFunctions"/> class.

    /// </summary>

    static XsltCustomFunctions()

    {

 

    }

 

    /// <summary>

    /// Initializes a new instance of the <see cref="XsltCustomFunctions"/> class.

    /// </summary>

    XsltCustomFunctions()

    {

 

    }

 

    #endregion

 

    #region Methods

 

    #region public

 

    /// <summary>

    /// Gets the average.

    /// </summary>

    /// <param name="xml">The XML.</param>

    /// <returns></returns>

    public string GetAverage(string xml)

    {

        string response = String.Empty;

 

        if (!String.IsNullOrEmpty(xml))

        {

            ///

        }

 

        return response;

    }

 

    #endregion

 

    #endregion

}

Lo siguiente que tenemos que hacer es añadir un ExtensionObject para poder llamar a los métodos de la clase que creamos anteriormente. Esto lo vamos a hacer sobreescribiendo el método ModifyXsltArgumentList del ContentQueryByWebPart:

public class MyContentByQueryWebPart : ContentByQueryWebPart

{

    /// <summary>

    /// Modifies the XSLT argument list.

    /// </summary>

    /// <param name="argList">The arg list.</param>

    protected override void ModifyXsltArgumentList(ArgumentClassWrapper argList)

    {

        argList.AddExtensionObject("http://www.midominio.es/Assembly/XsltCustomFunctions", 

            TC.REDILC.Common.XsltCustomFunctions.Instance);

 

        base.ModifyXsltArgumentList(argList);

    }

}

El primer parámetro es el namespace (Puedes poner el que tu quieras en mi caso uso el nombre de la empresa + nombre de assembly + clase) que luego usaremos en el Xsl y el segundo es una instancia de la clase que creamos anteriormente.

Como veis, se hace uso del patrón Singleton para no estar creando un monton de instancias cada vez que se llama al método y así mejorar el performance y ahorrar memoria.

Por último solo nos queda crear el Xsl y llamar a nuestro método. Lo primero registrar el namespace que usamos cuando añadimos el ExtensionObject:

<xsl:stylesheet 

  version="1.0" 

  exclude-result-prefixes="x d xsl msxsl cmswrt"

  xmlns:x="http://www.w3.org/2001/XMLSchema" 

  xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" 

  xmlns:cmswrt="http://schemas.microsoft.com/WebParts/v3/Publishing/runtime"

  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"

  xmlns:geeksms="http://www.midominio.es/Assembly/XsltCustomFunctions">

Y por último la llamada al método:

<div class="average">

    <xsl:value-of select="geeksms:GetAverage(Xml)" />

</div>

Espero que os sirva, un saludo y buen finde para todos 🙂