domingo, 30 de mayo de 2010

Segmento de código: Como obtener el valor de una llave en el archivo de configuración de la aplicación Web desde un Event Receiver de SharePoint

Este es un código encontrado en la red desde hace mucho tiempo, pero lo dejo en mi blog para no olvidarlo  y aprovecho para explicárselos.

Un Event Receiver se encapsula en una solución que instala un DLL en el GAC del servidor y se ejecuta en el sitio donde esta activada la solución y afecta a todas las listas se dispara como un Trigger cuando es modificado un elemento de una lista dentro del sitio, por ello no es especifico a la ejecución de una página y no es tan fácil de obtener el valor de una llave en el archivo de configuración.

Uno de los eventos que se pueden atrapar de una lista es cuando de Agrega un elemento. 

image

Por medio de SPItemEventProperties podemos obtener la información de la lista y del contexto donde esta ejecutándose.

image

Obtenemos la Propiedad de SiteID para abrir el sitio donde se ejecuta la lista y SPSite tiene otra propiedad SPWebApplication obtenemos el nombre y con ello podemos acceder el archivo de configuración de la aplicación Web donde se disparó el evento de la lista que se esta modificando.  WebConfigurationManager tiene un método para abrir el archivo de configuración y lo demás es código ASP.Net estándar para obtener el valor de una llave de la sección AppSettings.

Hasta la próxima,

Manolo Herrera

Segmento de Código en SharePoint: Como obtener el login Name de los asistentes de un sitio de reuniones

Quiero compartir con ustedes este segmento de código que pienso puede ser útil debido a que es algo engañoso el obtener los login Name de los asistentes.

Dentro del Sitio de Reuniones accedemos la lista de asistentes y utilizamos SPQuery para obtener la columna AssignedTo de dicha lista construyendolo a través de CAML como se muestra abajo:

image

Ejecutamos el query a través del metodo GetItems de la clase SPList y luego recorremos cada uno de los elementos que contiene que son cada uno de los asistentes. 

image

AssignedTo es de Tipo SPFieldUserValue si pasamos en el contructor el valor de la columna AssignedTo a dicho objeto.  Descubriremos que tiene una propiedad SPUser que nos dará el LoginName del asistente.  Y con eso obtenemos el LoginName del asistente que es como la llave única para validar el usuario contra el AD y otros valores que necesitemos.

Eso es todo amigos, si están interesados en personalizar los sitios de reuniones de SharePoint esta información les puede ser de utilidad.

Code4Fun!,

Manolo Herrera

jueves, 27 de mayo de 2010

Error en los espacios de trabajo de SharePoint g_InstanceID

Un error documentado por Microsoft.  Esto error muestra cuando hemos personalizado la Master Page y al parecer necesitamos agregar unas líneas para corregir el problema:

Síntoma:

Al intentar hacer clic sobre una de las fechas del lado izquierdo no nos lleva a ningún lugar y nos muestra en la barra de estado del explorador error.  Si hacemos clic sobre el nos muestra el siguiente error:

Message: 'g_instanceId' is undefined
Line: 4434
Char: 2
Code: 0

Solución:

Debe de modificar la Pagina maestra personalizada que esta utilizando agregando las siguientes dos líneas:

Abajo de la etiqueta <%@ Import Namespace="Microsoft.SharePoint" %>

aplique esta etiqueta:

<%@ Register Tagprefix="Meetings" Namespace="Microsoft.SharePoint.Meetings" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

abajo de la etiqueta <body>

<Meetings:PropertyBag runat="server"/>

La referencia del artículo es la siguiente:

http://blogs.msdn.com/b/spdsupport/archive/2008/03/24/how-to-fix-recurring-meeting-workspace-error-g-instanceid-is-undefined.aspx

Mis comentarios adicionales es luego de modificarla y subirla, no se olvide de publicarla y aprobar la publicación aplique de nuevo la Master Page al sitio o a la colección según sea el caso .

Nota: Agradezco a mi amiga y colega Emy Alegre por el tip.

SharePoint4Fun!,

Manolo Herrera

miércoles, 26 de mayo de 2010

Aplicando el patrón Passive View en un elemento Web en SharePoint - Parte II

En esta segunda parte (aquí la Primera parte) vamos a revisar el  Patrón Passive View aplicado al mismo elemento Web de la primera parte para que vea el cambio y como es este patrón una alternativa para tener un código mucho mas limpio y por ende mucho mas fácil de modificar o adaptar.

Passive View es una variación del popular patrón Model View Presenter.  Básicamente tenemos una vista tonta que lo único que sabe es mostrar la información toda la lógica de la vista esta en el presentador (o controlador) y este es el único que puede acceder el modelo. 

Aclaraciones:

En el siguiente código de ejemplo transfiero DTO’s a la vista para que la vista se encargue en el caso de una colección del binding .   No creo que este rompiendo el patrón por hacer esto, no encontré en la red ningún ejemplo que resolviera esto adecuadamente y no creo tampoco que el que la vista conozca un DTO este conociendo el modelo, simplemente es una forma muy practica de enlazar la data. Mas adelante muestro el ejemplo para que se comprenda mas este punto.

 

Infraestructura:

    1. Virtual Machine Windows Server 2003
    2. SQL Server 2005 Std Edition
    3. SharePoint Server 2007
    4. Visual Studio 2008 SP1
    5. WSPBuilder (para construir soluciones para SharePoint)

Empecemos:

Primero vamos a crear un elemento Web para SharePoint la herramienta a utilizar WSPBuilder, le vamos a llamar EditarTarea.

image

Luego crear un control de Usuario como la parte visual donde mostremos los controles de usuario (vea Primera parte).

image

Luego vamos a crear la interfase que representará la vista en el presentador inicialmente nos vamos a concentrar en como amarrar la vista con el control de usuario y el presentador.

La vista:

image .

La inyección de la vista en el presentador:

image

La implementación de la interfase en el control de usuario:

image

Continuamos ahora con los eventos declarándolos en la vista ya que es lo único que el presentador conoce de la vista

image

En el control de usuario implementamos dicha declaración amarrándolos con los eventos de los controles de usuario.

image

Ahora veamos como suscribimos los eventos en el presentador

image

La lógica de los eventos se define en el presentador, veamos algunos ejemplos:

image

Ahora vamos a ver las propiedades de la vista

image

Su implementación en el control de usuario

image

image

image

image

Su uso en el presentador es muy variado y dependerá de la lógica observe el siguiente ejemplo:

image

La meta en el presentador es mantener únicamente la lógica de la vista y separar las responsabilidades tanto de la vista como del modelo de tal forma que no tengamos dependencia de ninguna tecnología Web o de proveedor de datos. Esto lo podemos validar revisando los espacios de nombre utilizados en el presentador.  Como se  muestra abajo los usings del presentador:

image

Esto quiere decir que hemos encapsulado las referencias en el modelo o en la vista.  Cualquier cosa que necesitemos deberemos de invocarlo a través de propiedades, eventos y métodos a la vista o hacia el modelo. 

En el presentador hacemos la invocación de las dependencias hacia el modelo como lo muestro a continuación:

image

Revisemos algunas de sus dependencias como ha sido implementadas:

image

image

Como inicio la escritura del patrón de la siguiente forma:

  1. Creo el elemento Web con WSPBuilder en Visual Studio.
  2. Creo el control de usuario y desarrollo la parte visual.
  3. Finalizada la parte visual defino una Interfase que representa el control de usuario que finaliza con el sufijo Vista.
  4. Creo una clase con sufijo Presentador y coloco como parámetro la interfase de la vista para que sea inyectado definiendo un campo privado que representa la vista
  5. Implemento la vista en el control de usuario e inyectando la vista en el presentador en el evento OnInit().
  6. Luego empiezo declarando todos los eventos que me interesan atrapar del control usuario en la interfase de la vista e implementándolos en el control de usuario y en el presentador
  7. Continuo con las propiedades base que será los valores capturados por el usuario dentro de los controles.
  8. Inicio la lógica en el presentador y esto me va llevando a crear una nueva propiedad en la vista o a invocar el modelo definiendo interfaces y su implementación correspondiente encapsulando ésta responsabilidad en un servicio y repositorio. 

Resumen

El propósito de aplicar este patrón en nuestro desarrollo para elementos Web en SharePoint es fundamentalmente para mantener un código limpio que se traduce en una mejor lectura y comprensión del mismo para su mantenibilidad y que esta listo para ser probado ya que están bien separadas las responsabilidades.

Una vez comprendida las responsabilidades de cada uno de los actores dentro del patrón es mecánico el proceso de su codificación y no es para nada complicado.

Code4Fun!,

Manolo Herrera

martes, 25 de mayo de 2010

Resolviendo correctamente URL con apostrofes en elemento Web de SharePoint

Recientemente tuve que resolver un problema con URL.  El caso es el siguiente:

Un cliente esta acostumbrado a utilizar el apostrofe en el nombre del sitio y como es el mimo que utiliza para crear el URL en SharePoint entonces el GridView tenía un ItemTemplate dentro del el un LinkButton que tenía en la propiedad URLPostBack un Bind(‘URL’)

Algo como esto:

<asp:LinkButton id=”Enlace” runat=”server” URLPostBack=”<%# Bind(‘URL´)%>” />

Pero ASP.Net realiza un Encode del valor desplegado en el control y estaba convirtiendo el Apostrofe (‘) en una diagonal Apostrofe(/’). Entonces el IIS lo interpreta como otro sitio después de leer la diagonal y por consiguiente no encontraba la dirección. 

Si manualmente quitábamos la diagonal adicional el sitio era encontrado.

Solución:

Agregue el atributo ToolTip al control LinkButton agregando allí el Bind(‘URL’) y agregue el evento OnClick. 

 

<asp:LinkButton id=”Enlace” runat=”server” ToolTip=”<%# Bind(‘URL´)%>” OnClick=”Enlace_OnClick”/>

 

Del lado del servidor este fue el código que escribí:

protected void Enlace_OnClick(object sender, EventArgs e)

{

      LinkButton enlace = sender as LinkButton;

      if(enlace != null)

      {

             Response.Redirect(enlace.ToolTip,true);

      }

}

Y eso fue todo ya no altera el apostrofe incorrectamente y el sitio se abre correctamente.

Code4Fun!,

Manolo Herrera