[SharePoint 2007] Camino de la Web 2.0 (Ajax Control Toolkit + Rating)

No se sí el título es muy acertado pero no se  me ocurría otra cosa :).

En un portal de publicación estamos añadiendo la parte de Rating, Comments, Cloud Tags, Geolocalización de información… (Web 2.0) y me he decantado por usar para la parte de rating el Ajax Control Toolkit de Microsoft (A partir de ahora ACT) y en concreto el control de Rating que incorpora. Os voy a comentar un poco las peripecias de hacer funcionar todo esto en SharePoint 2007:

Para poder usar el ACT es necesario añadir la librería a la GAC y añadir las siguientes entradas al Web.Config:

  • En el elemento SafeControls:
<SafeControl 

    Assembly="AjaxControlToolkit, Version=3.0.30930.22557, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" 

    Namespace="AjaxControlToolkit" 

    TypeName="*" 

    Safe="True" />

  • En el elemento assemblies:
<add 

    assembly="AjaxControlToolkit, Version=3.0.30930.22557, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/>

  • En elemento pages –> controls:
<add 

    namespace="AjaxControlToolkit" 

    assembly="AjaxControlToolkit, Version=3.0.30930.22557, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" 

    tagPrefix="ajaxToolkit"/>

 

 

Una vez hecho esto, vamos a añadir el ScriptManager a la página maestra de nuestro sitio, para ello lo primero añadir esta directiva de página:

<%@ Register 

    TagPrefix="ajaxToolkit" 

    Assembly="AjaxControlToolkit, Version=3.0.30930.28755, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" 

    Namespace="AjaxControlToolkit" %>

Por último añadir el ScriptManager a la página (En mi caso lo he añadido justo después del tag form):

<form id="Form1" runat="server" onsubmit="return _spFormOnSubmitWrapper();">

    <ajaxToolkit:ToolkitScriptManager runat="Server" EnablePartialRendering="true" ID="scriptManager" />

Con esto ya podemos trabajar con esta suite de controles, pero no todo es tan bonito y es que me he encontrado con varios problemas a la hora de trabajar con el control:

1) Cuidado con añadir la propiedad AutoPostback al control

Deja inutilizado el javascript del portal y cambia hasta el título de la página (Un comportamiento raro:S) además sí lo dejamos por defecto el evento Changed se ejecuta sin problemas.

image

Yo lo tengo así en el ascx:

<%@ Register 

    TagPrefix="ajaxToolkit" 

    Assembly="AjaxControlToolkit, Version=3.0.30930.28755, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" 

    Namespace="AjaxControlToolkit" %>

 

<asp:UpdatePanel runat="server" ID="updatePanel">

    <ContentTemplate>

        <ajaxToolkit:Rating 

            ID="rating" 

            runat="server"

            BehaviorID="RatingBehavior1"

            CurrentRating="0"

            MaxRating="5"

            RatingAlign="Horizontal"

            RatingDirection="LeftToRightTopToBottom"

            StarCssClass="ratingStar"

            WaitingStarCssClass="savedRatingStar"

            FilledStarCssClass="filledRatingStar"

            EmptyStarCssClass="emptyRatingStar"

            OnChanged="UpdateRating"

            style="float: left;" />

    </ContentTemplate>

</asp:UpdatePanel>

2) Bloquear el Rating para que sólo haya una valoración por usuario

Cuando un usuario valora un contenido, lo suyo es deshabilitar el control para evitar que valore más de una vez sobre el mismo contenido. Para ello, el control dispone de una propiedad pública llamada ReadOnly que al ponera a true no podrá modificarse. Sí lo haces a través de del evento OnChanged no te va a funcionar, es decir:

/// <summary>

/// Run custom code when the user rates something and then return a custom string

/// to the JavaScript client

/// </summary>

/// <param name="sender">Rating control</param>

/// <param name="e">RatingEventArgs</param>

protected void Rating_Changed(object sender, RatingEventArgs e)

{

    Rating.ReadOnly = true;

    e.CallbackResult = "Update done. Value = " + e.Value + " Tag = " + e.Tag;

}

 

Para ello, necesitamos hacer uso de JavaScript. Con el siguiente código podrás detectar el CallBack a cliente y deshabilitar el control:

javascript = @"Sys.Application.add_load(function() ;

                {

                    $find('RatingBehavior1').add_EndClientCallback( 

                        function(sender, e) 

                        {

                            $find('RatingBehavior1').set_ReadOnly(true);

                        });

                });"

 

Page.ClientScript.RegisterStartupScript(this.GetType(), "readonly", javascript, true);

 

Lo suyo es chequear en la parte servidora, que sí se hace el rating correctamente del tipo de contenido mandemos un OK al cliente para poder chequearlo en el CallBack y así deshabilitar o no el control.

3) Problemas al hacer click sobre la valoración que está marcada (CurrentRating)

Sí el usuario entra a ver el contenido de la publicación, le mostramos la media de la valoración de todos los usuarios (Por ejemplo 2 estrellitas) sí el quiere valorarlo con 2 estrellas no funcionará, es un error del Rating y he encontrado aquí este script para solucionarlo:

function AddNewRatingHandler() {

 

    AjaxControlToolkit.RatingBehavior.prototype._onStarClick =

        function(e) {

            if (this._readOnly) {

                return;

            }

            //   if (this._ratingValue != this._currentRating) {                    

            this.set_Rating(this._currentRating);

            // }

        };

        AjaxControlToolkit.RatingBehavior.prototype.set_Rating = function(value) {                    

            //   if (this._ratingValue != value) {

            this._ratingValue = value;

            this._currentRating = value;

            if (this.get_isInitialized()) {

                if ((value < 0) || (value > this._maxRatingValue)) {

                    return;

                }

 

                this._update();

 

                AjaxControlToolkit.RatingBehavior.callBaseMethod(this, 'set_ClientState', [this._ratingValue]);

                this.raisePropertyChanged('Rating');

                this.raiseRated(this._currentRating);

                this._waitingMode(true);

 

                var args = this._currentRating + ';' + this._tag;

                var id = this._callbackID;

 

                if (this._autoPostBack) {

                    __doPostBack(id, args);

                }

                else {

                    WebForm_DoCallback(id, args, this._receiveServerData, this, this._onError, true)

                }

 

            }

            //  }

        };                

}

AddNewRatingHandler();

 

 

 

Con todo esto y algo más ya puedo hacer Rating de todos los tipos de contenido del portal:

image

Por suerte todo esto lo tendremos disponible con SharePoint 2010 😉

Un saludo y hasta después de Reyes que me hace falta un descanso :)

Un comentario sobre “[SharePoint 2007] Camino de la Web 2.0 (Ajax Control Toolkit + Rating)”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *