domingo, 11 de enero de 2009

Ajax sobre Sharepoint

Continuando con la temática de este mes acerca de dar una introducción al desarrollo sobre Sharepoint, nos queda por ver como montar Ajax en Sharepoint.

Ya se ha hablado mucho sobre este tema por lo que me limitaré a dejar una referencia rápida:

Lo primero será instalar las extensiones de AJAX, si tenemos el Framework 3.5 no será necesario instalarlo, en caso contrario tendremos que descargar el kit “ASP.NET 2.0 AJAX Extensions”.

Una vez instalado tendremos que configurar nuestro web.config:

Verificaremos el nº de versión de la librearía “System.web.extension”, para verlo podremos visualizarlo desde el GAC en “c:\windows\assembly”.

A continuación abriremos nuestros web.config, por defecto están alojados en la carpeta “c:\inetpub\wwwroot\wss\VirtualDirectories”.

1. Añadiremos un nuevo sectionGroup en la zona configSections:

<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
      <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
          <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
        <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
          <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere" />
          <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
          <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
        </sectionGroup>
      </sectionGroup>
    </sectionGroup>

2.Añadimos una sección controls en la sección “pages”:

<pages>
      <controls>
        <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </controls>
</pages>

3. Añadimos el siguiente assemblie en la sección de assemblyes:

<assemblies>
       <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</assemblies>

4. Registramos los manejadores:

<httpHandlers>
      <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
</httpHandlers>

6. Añadimos el módulo de Ajax en la sección httpModules:

<httpModules>
      <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </httpModules>

7. Permitimos que los controles incluidos en la librería de Ajax puedan ejecutarse en Sahrepoint:

<SafeControls>
      <SafeControl Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*" Safe="True" />
</SafeControls>

Una vez registrado, verificaremos que todo funciona correctamente. Si nos hemos dejado algo o lo hemos registrado mal puede que nos de un error de ASP.NET al entrar en cualquier página del web application.

Nos quedaría por registrar el scriptmanager en las páginas para que podamos utilizar los controles de Ajax. Podremos hacerlo de varias formas:

  • Incluyéndolo en la masterpage
  • Auto-registrándolo desde un webpart.

Incluyéndolo en la masterpage

Consiste en modificar la masterpage para incluir el scriptmanager. Este caso es válido siempre que tengamos la misma masterpage en todos los subsitios, en caso de tener una jerarquí de sitios muy grande y que encima no hereden del padre tendremos que recurrir al autoregistro desde el propio webpart.

En el post anterior “Modificar la apariencia de nuestro sitio” vimos como modificar nuestra masterpage (por lo que no detallaremos como realizar la modificación).

Abriremos entonces la masterpage, y añadiremos el siguiente código cerca de la definición de <WebPartPages:SPWebPartManager>  :

<asp:ScriptManager runat="server" ID="ScriptManager1"></asp:ScriptManager>

Si quisiéramos utilizar el control UpdatePanel tendremos que registrar el siguiente script en la página:

<script type='text/javascript'>_spOriginalFormAction = document.forms[0].action; _spSuppressFormOnSubmitWrapper=true;</script>

Auto-registrándolo desde un webpart

Si queremos asegurarnos que nuestro webpart con ajax va a funcionar desde cualquier página podremos recurrir a registrar el scriptmanager mediante programación añadiendo el siguiente código en el evento Oninit:

 

protected override void OnInit(EventArgs e) {

base.OnInit(e);

//get the existing ScriptManager if it exists on the page

_AjaxManager = ScriptManager.GetCurrent(this.Page);

if (_AjaxManager == null)   {

//create new ScriptManager and EnablePartialRendering

  _AjaxManager = new ScriptManager();

  _AjaxManager.EnablePartialRendering = true;

// Fix problem with postbacks and form actions (DevDiv 55525)

Page.ClientScript.RegisterStartupScript(typeof(AjaxBasePart), this.ID, "_spOriginalFormAction = document.forms[0].action;", true);

//tag:"form" att:"onsubmit" val:"return _spFormOnSubmitWrapper()" blocks async postbacks after the first one

//not calling "_spFormOnSubmitWrapper()" breaks all postbacks

//returning true all the time, somewhat defeats the purpose of the _spFormOnSubmitWrapper() which is to block repetitive postbacks, but it allows MS AJAX Extensions to work properly

//its a hack that hopefully has minimal effect

if (this.Page.Form != null)   {

string formOnSubmitAtt = this.Page.Form.Attributes["onsubmit"];

if (!string.IsNullOrEmpty(formOnSubmitAtt) && formOnSubmitAtt == "return _spFormOnSubmitWrapper();")  {

this.Page.Form.Attributes["onsubmit"] = "_spFormOnSubmitWrapper();";

  }

//add the ScriptManager as the first control in the Page.Form//I don't think this actually matters, but I did it to be consistent with how you are supposed to place the ScriptManager when used declaritevly

this.Page.Form.Controls.AddAt(0, _AjaxManager);

               }

            }

}

No hay comentarios: