January 2010 - Artículos

[MOSS 2007] Conectar WebParts programáticamente

Conectar 2 WebParts (por ejemplo un buscador y grid) a través del interfaz de SharePoint es una cosa sencilla, pero seguro que alguna vez has necesitado hacerlo a través del modelo de objetos de MOSS. En nuestro caso tenemos varios Custom WebParts que una vez desplegado el portal necesitamos conectarlos y lo hemos hecho vía Feature (No voy a poner el código entero del FeatureReceiver).

Uno de los problemas que te puedes encontrar al hacer esto lo comenté en un post anterior:

http://geeks.ms/blogs/lruiz/archive/2009/11/18/moss-2007-webparts-del-tipo-errorwebpart-aparecen-cuando-usamos-splimitedwebpartmanager.aspx

y en nuestro caso son buscadores sobre unos custom CQWP, por eso el Receiver al no disponer de contexto debe contener estas líneas:

if (HttpContext.Current == null)
{
    HttpRequest httpRequest = new HttpRequest(String.Empty, web.Url, String.Empty);
    HttpContext.Current = new HttpContext(httpRequest, new HttpResponse(new StringWriter()));
    HttpContext.Current.Items["HttpHandlerSPWeb"] = web;
}

Una vez hecho esto, a través de las propiedades de la feature, obtenemos la página y los 2 WebPart que queremos conectar.

Localizamos la página en la colección de páginas, obtenemos una referencia al objeto SPFile (Para poder hacer CheckOut, CheckIn y Publish).

Obtenemos una referencia al SPLimitedWebPartManager de la página para poder obtener la colección de WebParts de la misma mediante la propiedad WebParts.

Una vez que hemos localizado los 2 WebParts que vamos a conectar, obtenemos el ConsumerConnectionPointCollection (Contiene una colecciónde ConsumerConnectionPoint que habilita a un WebPart a actuar como Provider) y el ProviderConnectionPointCollection (Contiene una colección de ProviderConnectionPoint que habilita a un WebPart a actuar como Provider).

Una vez hecho esto necesitamos un objeto del tipo SPWebPartConnection que lo obtenemos mediante el método SPConnectWebParts al que le pasamos como parámetros el WebPart que suministra la conexión y su ProviderConnectionPoint y el WebPart que va a consumir su conexión y su ConsumerConnectionPoint.

Por último añadimos a la colección de conexiones del WebPartManager la conexión que hemos obtenido anteriormente y ya tendremos nuestros WebPart conectados vía modelo de objetos.

Aquí está el código de ejemplo:

PublishingWeb publishingWeb = PublishingWeb.GetPublishingWeb(web);
PublishingPageCollection pages = publishingWeb.GetPublishingPages();
 
/// Check if the Page exists, null if not exists
PublishingPage page = pages.SingleOrDefault(p => p.Name == pageName);
 
if (page != null)
{
    SPWebparts.WebPart wpProvider = null;
    SPWebparts.WebPart wpConsumer = null;
 
    /// Get SPFile because it's necessary for Publish and Approve(This one if
    /// PagesList.EnableModeration is true)
    SPFile aspx = web.GetFile(page.Url.ToString());
 
    aspx.CheckOut();
 
    SPLimitedWebPartManager webPartManager =
        aspx.GetLimitedWebPartManager(PersonalizationScope.Shared);
 
    SPLimitedWebPartCollection webparts =
        webPartManager.WebParts;
 
    wpProvider = (SPWebparts.WebPart)webPartManager.WebParts[webpart.ID];
    wpConsumer = (SPWebparts.WebPart)webPartManager.WebParts[webpart.ID];
 
    /// Creates the connection
    if (wpProvider != null &&
        wpConsumer != null)
    {
        ConsumerConnectionPointCollection consumerConnection
            = webPartManager.GetConsumerConnectionPoints(wpConsumer);
 
        ProviderConnectionPointCollection providerConnection
            = webPartManager.GetProviderConnectionPoints(wpProvider);
 
        SPWebPartConnection webPartConnection =
            webPartManager.SPConnectWebParts(wpProvider,
                                             providerConnection[0],
                                             wpConsumer,
                                             consumerConnection[0]);
 
        webPartManager.SPWebPartConnections.Add(webPartConnection);
    }
 
    aspx.CheckIn(String.Empty);
    aspx.Publish(String.Empty);
 
    if (publishingWeb.PagesList.EnableModeration)
    {
        aspx.Approve(String.Empty);
    }
}

Un saludo

[Tips C#] Mi opinión sobre el artículo “IsDate() function in C#”

Esta máñana leyendo mis RSS, he visto este artículo y he pensado en comentarlo, pero mejor me hago un post y muestro como lo haría yo.

Viendo el primer código que publicó:

image 

Salta a la vista que con un TryParse se quita la excepción y además recordar que se introdujo en el 2.0 precisamente para evitar usar el try catch y mejorar el performance, es decir que una vez modificado le queda:

image

Pero para mí ese método sería candidato a un Extension Method de la clase DateTime:

public static class Extensions
{
    /// <summary>
    /// Determines whether the specified datetime is date.
    /// </summary>
    /// <param name="datetime">The datetime.</param>
    /// <param name="inputdate">The inputdate.</param>
    /// <returns>
    ///     <c>true</c> if the specified datetime is date; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsDate(this DateTime datetime, string inputdate)
    {
        return DateTime.TryParse(inputdate, out datetime);
    }
}

Además de no declarar la variable dt de tipo DateTime y usar la de la misma clase, total para validar si es o no válida, no?

Con lo que nos queda:

bool isValidDate = DateTime.Now.IsDate("18/01/2010");

Podríamos añadir sobrecargas para el formato y demás :)

Un saludo

Publicado por Luis Ruiz Pavón | 4 comment(s)
Archivado en: ,,