[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 :)

Published 30/12/2009 17:27 por Luis Ruiz Pavón
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2009/12/30/sharepoint-2007-camino-de-la-web-2-0-ajax-control-toolkit-rating.aspx

Comentarios

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

gracias por todos, e por mejor

Monday, April 19, 2010 8:05 PM por feeds