5 de septiembre de 2011

Como usar AJAX Control Toolkit 3.5 en SharePoint 2007 (MOSS 2007)

Recientemente se presentó una situación que derivó posteriormente en una tarea, y consistía en poder usar un control (ListSearchExtender) del AJAX Control Toolkit 3.5 en un sitio de SharePoint 2007 (MOSS).

La versión 3.5 del AJAX Control Toolkit se basa en el .NET Framework 3.5, por tal motivo partiremos de que tenemos (al menos) la siguiente configuración:

  • Windows 2003 Adv. Server
  • SharePoint 2007 (MOSS) 
  • .NET Framework 3.5
  • VS 2008
  • AJAX Control Toolkit 3.5
  • Además algún web.part que pueda contener el Control de Usuario (UCController, SmartPart, etc.)

Solución

Además, para el ejemplo, montaremos en SharePoint 2007 un nuevo grupo de aplicaciones con su sitio principal.

Los pasos serán los siguientes:

  1. Modificar el Web.Config para habilitar el AJAX.Net 3.5
  2. Crear la Aplicación Web que contendrá el Control de Usuario que añadiremos en SharePoint 2007.
  3. Copiar el Control de Usuario y la dll correspondiente.
  4. Modificar el Web.Config para habilitar el Control de Usuario
  5. Modificar la página de SharePoint donde se usara el control.

 

1. Modificar el Web.Config para habilitar el AJAX.Net 3.5

Deberemos abrir el web.config correspondiente a la aplicación web, en mi caso se encuentra en la siguiente ruta (C:\Inetpub\wwwroot\wss\VirtualDirectories\SPNet3.5_4202). Con esta modificación estamos habilitando el uso de Ajax.Net 3.5.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<configuration>

        <configSections>

                <!--Ajax.Net  1 de 8 Begin-->

                <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"/>

                                       <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>

                               </sectionGroup>

                        </sectionGroup>

                </sectionGroup>

                <!--Ajax.Net  1 de 8 End-->

                <!-- ... -->

        </configSections>

        <SharePoint>           

                <SafeControls>

                        <!--Ajax.Net  2 de 8 Begin-->

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

                        <!--Ajax.Net  2 de 8 End-->

                        <!-- ... -->

                </SafeControls>

        </SharePoint>

        <system.web>

                <httpHandlers>

                        <!-- ... -->

                        <!--Ajax.Net  3 de 8 Begin-->

                        <remove verb="*" path="*.asmx" />

                        <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" />

                        <!--Ajax.Net  3 de 8 End-->

                        <!-- ... -->

                </httpHandlers>

                <httpModules>

                        <clear />

 

                        <!--Ajax.Net  4 de 8 Begin-->

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

                        <!--Ajax.Net  4 de 8 End-->

                        <!-- ... -->

                </httpModules>

                <compilation batch="false" debug="true">

                        <assemblies>

                               <!--Ajax.Net  5 de 8 End-->

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

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

                               <!--Ajax.Net  5 de 8 Begin-->

                               <!-- ... -->

                        </assemblies>

                </compilation>

                <pages enableSessionState="false" enableViewState="true" enableViewStateMac="true" validateRequest="false" pageParserFilterType="Microsoft.SharePoint.ApplicationRuntime.SPPageParserFilter, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" asyncTimeout="7">

                        <!--Ajax.Net  6 de 8 Begin-->

                        <controls>

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

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

                               <add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit, Version=3.5.50731.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" tagPrefix="ajax" />

                        </controls>

                        <!--Ajax.Net  6 de 8 End-->

                        <!-- ... -->

                </pages>

 

                <trust level="Full" originUrl="" />

                <!-- ... -->

        </system.web>

        <runtime>

                <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

                        <!--Redirigir Ajax 1.1 a Ajax 3.5-->

                        <dependentAssembly>

                               <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>

                               <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>

                        </dependentAssembly>

                        <dependentAssembly>

                               <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>

                               <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>

                        </dependentAssembly>

                        <!--Redirigir Ajax 1.1 a Ajax 3.5 END-->

 

                        <!--Ajax.Net  7 de 8 Begin-->

                        <dependentAssembly>

                               <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>

                               <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>

                        </dependentAssembly>

                        <dependentAssembly>

                               <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>

                               <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>

                        </dependentAssembly>

                        <!--Ajax.Net  7 de 8 End-->

 

                        <!-- ... -->

                </assemblyBinding>

        </runtime>

 

        <!--Ajax.Net  8 de 8 Begin-->

        <system.web.extensions>

                <scripting>

                        <webServices>

                               <jsonSerialization maxJsonLength="500000">

                                       <converters>

                                       </converters>

                               </jsonSerialization>

                        </webServices>

                        <scriptResourceHandler enableCompression="false" enableCaching="true" />

                </scripting>

        </system.web.extensions>

        <system.webServer>

                <validation validateIntegratedModeConfiguration="false" />

                <modules>

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

                </modules>

                <handlers>

                        <remove name="WebServiceHandlerFactory-ISAPI-2.0" />

                        <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

                        <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, &#xD;&#xA;      System.Web.Extensions, Version=3.5.0.0, Culture=neutral, &#xD;&#xA;      PublicKeyToken=31bf3856ad364e35" />

                        <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, &#xD;&#xA;      System.Web.Extensions, Version=3.5.0.0, Culture=neutral, &#xD;&#xA;      PublicKeyToken=31bf3856ad364e35" />

                </handlers>

        </system.webServer>

        <!--Ajax.Net  8 de 8 End-->

</configuration>

 

2. Crear la Aplicación Web que contendrá el Control de Usuario que añadiremos en SharePoint 2007.

En este punto abriremos nuestro Visual Studio (2008) y crearemos un nuevo proyecto de tipo Aplicación Web, aquí deberemos tener en cuenta los siguientes puntos:

  • El nuevo proyecto deberá usar .Net Framework 3.5
  • El ensamblado debe estar firmado para poderse usar en SharePoint.

Teniendo en cuenta estos aspectos solo nos quedaría crear nuestro control de usuario con la lógica deseada.

El control de usuario no contendrá ni el ScriptManager ni el ToolkitScriptManager.

 

3. Copiar el Control de Usuario y la dll correspondiente.

Posteriormente copiaremos el fichero .ascx del control de usuario a la carpeta correspondiente (Ej: C:\Archivos de programa\Archivos comunes\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS\usercontrols\wucPrueba2.ascx)

Además copiaremos la dll del proyecto en la carpeta BIN de publicación en el IIS (Ej: C:\Inetpub\wwwroot\wss\VirtualDirectories\SPNet3.5_4202\bin).

 

4. Modificar el Web.Config para habilitar el Control de Usuario.

Deberemos abrir nuevamente el web.config correspondiente a la aplicación web, en mi caso se encuentra en la siguiente ruta (C:\Inetpub\wwwroot\wss\VirtualDirectories\SPNet3.5_4202). Con esta modificación estamos habilitando el uso del control de usuario creado, y el Ajax Control Toolkit 3.5.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<configuration>

  <!-- ... -->

  <SharePoint>

    <!-- ... -->

    <SafeControls>

      <!-- ... -->

                        <SafeControl Assembly="WebAppTestWebPartUC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=fadac282bc92d52f" Namespace="WebAppTestWebPartUC.UserControls" TypeName="*" Safe="True" />

                        <SafeControl Assembly="AjaxControlToolkit, Version=3.5.50731.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" Namespace="AjaxControlToolkit" TypeName="*" Safe="True" />

    </SafeControls>

  </SharePoint>

  <system.web>

    <!-- ... -->

    <pages enableSessionState="false" enableViewState="true" enableViewStateMac="true" validateRequest="false" pageParserFilterType="Microsoft.SharePoint.ApplicationRuntime.SPPageParserFilter, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" asyncTimeout="7">

      <controls>

        <!-- ... -->

        <add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit, Version=3.5.50731.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" tagPrefix="ajax" />

      </controls>

      <!-- ... -->

    </pages>

    <trust level="Full" originUrl="" />

    <!-- ... -->

  </system.web>

  <!-- ... -->

</configuration>

 

5. Modificar la página de SharePoint donde se usará el control.

Por último, solo nos quedaría agregar el control de usuario a una página creada en SharePoint; para ello usaremos un web.part contenedor de controles de usuario.

Después modificaremos la página para añadirle el control ToolkitScriptManager. También podríamos añadir el control en la página maestra en lugar de hacerlo en la página.

<ajax:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"></ajax:ToolkitScriptManager>

Nota: El control que debemos añadir es el ToolkitScriptManager. Nunca el ScriptManager.

Enlaces Interesantes:

3 comentarios:

  1. ¿Qué ha pasado con esta fantástica página?¿Ya no publicáis nuevas entradas?. Muchas gracias por toda la información, he aprendido mucho con esta web. Gracias.

    ResponderEliminar
  2. Has hecho esto mismo en Windows Server 2008 R2 ????

    ResponderEliminar
  3. hola soy nuevo en cuanto asp.net muy buena la pagina, con respecto a montar una pag asp.net en un servidor no se nada, es necesario utilizar el windows server ?? o mejor dicho es la unica forma de montar la pag? o se puede de alguna otra manera en algun host??
    bueno espero alguien me pueda orientar un poco sobre como hacerlo

    ResponderEliminar