Hace un par de meses he tenido un par de requerimientos en los cuales he tenido que migrar una serie de webparts de MOSSS 2007 a Sharepoint 2010, para lo cual he utilizado como entorno de trabajo visual studio 2010 y he de decir que me encontrado con una gran cantidad de mejoras en lo que se relaciona a desarrollo con Sharepoint, esta nueva versión a incluido plantillas para la creación de Features las cuales traen toda la estructura necesaria para desarrollar caracteristicas de una forma amigable algunas de las mejoras que he podido apreciar son las siguientes:
- Mapeo directo a nuestra solución de carpetas como Templates,Layouts y controltemplates las cuales permiten facílmente ubicar archivos como controles ascx en sitios visible desde cualquier pagina en un sitio de sharepoint.
- Ahora mediante las opciones deploy y retract adicionadas en el menu contextual del proyecto instalar o desintalar nuestras features o webparts desde visual studio 2010.
- Es posible en esta nueva versión hacer debug de los webparts sin necesidad de attacharse al proceso de Sharepoint, simplemente con la ejecución del proyecto se hace posible hacer un paso a paso de la ejecución de los webparts.
- La inclusión de codigo administrado para la subscripción a los eventos activacion, deploy y desactivacion de las caracteristicas se logra mediante simple clic derecho sobre la caracteristica en la solucion y luego la selección de la opción de adicionar receptor de evento, obviando la necesidad de tener que crear ensamblados aparte !
Estas son algunas de las mejoras que he podido encontrar en esta nueva versión Sharepoint no he nombrado la facilidad queda para el desarrollo de webparts con Silverlight esto lo haré en el siguiente post, les dejo la primera webpart que migre de 2007 a 2010 es una sencilla pero muy util webpart que permite graficar las respuestas en una encuesta previamente configurada la puedes descargar en el siguiente link, hasta una próxima oportunidad
Este blog ha sido creado con el objetivo de almacenar información de temas referentes a la plataforma de sharepoint y tecnologias .Net.
viernes, 9 de julio de 2010
domingo, 18 de abril de 2010
Envio de correo electronico usando el modelo de objetos de sharepoint
Esto me ha resultado de gran ayuda al momento de construir webparts y flujos de trabajo para sharepoint ya que el envio de notificaciones es una tarea repetitiva en el desarrollo en sharepoint, bueno basicamente lo que usa para el envio de correos es el objeto SPUtility que se encuentra en Microsoft.Sharepoint.Utilities la verdad es bastante simple su uso:
SPUtility.SendEmail(myWeb, false, false, user.emailDestino, Subject, Cuerpo);
myWeb es un objeto de tipo SPWeb el cual puede obtenerse desde el objeto SPSite.
SPUtility.SendEmail(myWeb, false, false, user.emailDestino, Subject, Cuerpo);
myWeb es un objeto de tipo SPWeb el cual puede obtenerse desde el objeto SPSite.
Lectura dinamica de atributos usando reflection
Hace algún tiempo me encontre con la necesidad de leer todos los valores de los atributos de un tipo de dato proporcionado por un tercero y validar si todos tenian algo de data o estaban en null aparentemente esto no plantea ningun problema me valdria la siguiente instrucción para leer cada atributo de clase:
object valor = tipo.atributo;
una vez hecho esto para cada atributo validar si era o no nulo y en dependencia de esto ejecutar alguna acción, bueno hasta ahi todo estaba bien hasta que me di cuenta que el tercero a futuro podría agregar nuevos atributos al tipo, es decir que tendría que leer de forma dinamica los atributos, es aquí donde aparece la magia de reflection, esta clase nos permite leer las entrañas de cualquier tipo de dato de forma dinamica e incluso crear instancias de forma dinamica, en fin el siguiente código me permitio iterar sobre los atributos del tipo sin conocer cuantos ni cuales eran los nombres de los mismos.
//Obteniendo el objeto a leer desde un metodo
FundSig sigFunds = this.GetSigFunds(strProduct, strIdFund);
//Obteniendo todas las propiedades del tipo del objeto obtenido en la linea anterior
PropertyInfo[] properties = sigFunds.GetType().GetProperties();
//Iterando sobre las propiedades obtenidas
foreach (PropertyInfo info in properties)
{
//Obteniendo el valor de cada atributo en el objeto obtenido en el primer punto
if (sigFunds.GetType().GetProperty(info.Name).GetValue(sigFunds, null) == null)
{
return false;
}
}
Esto es solo una pequeña aplicación de lo que se puede hacer con reflection, espero les sea de ayuda !
object valor = tipo.atributo;
una vez hecho esto para cada atributo validar si era o no nulo y en dependencia de esto ejecutar alguna acción, bueno hasta ahi todo estaba bien hasta que me di cuenta que el tercero a futuro podría agregar nuevos atributos al tipo, es decir que tendría que leer de forma dinamica los atributos, es aquí donde aparece la magia de reflection, esta clase nos permite leer las entrañas de cualquier tipo de dato de forma dinamica e incluso crear instancias de forma dinamica, en fin el siguiente código me permitio iterar sobre los atributos del tipo sin conocer cuantos ni cuales eran los nombres de los mismos.
//Obteniendo el objeto a leer desde un metodo
FundSig sigFunds = this.GetSigFunds(strProduct, strIdFund);
//Obteniendo todas las propiedades del tipo del objeto obtenido en la linea anterior
PropertyInfo[] properties = sigFunds.GetType().GetProperties();
//Iterando sobre las propiedades obtenidas
foreach (PropertyInfo info in properties)
{
//Obteniendo el valor de cada atributo en el objeto obtenido en el primer punto
if (sigFunds.GetType().GetProperty(info.Name).GetValue(sigFunds, null) == null)
{
return false;
}
}
Esto es solo una pequeña aplicación de lo que se puede hacer con reflection, espero les sea de ayuda !
sábado, 10 de abril de 2010
Concurrencia en formularios infopath web forms
Recientemente me tope con un problema de concurrencia que presentan los formularios de infopath cuando se publican en sharepoint mediante form services, este problema se presenta cada vez que más de un usuario trata de modificar alguno de los campos promovidos desde el formulario hacia la lista de sharepoint en la cual se ha activado el formulario, ya que el contenido xml del formulario es descargado al browser cada vez que un usuario hace un llamado al mismo, si dos usuarios descargan el formulario al tiempo y modifican alguno de los campos promovidos al momento de guardar el formulario este queda con los cambios efectuados por el ultimo usuario que haya hecho submit hacia la lista. Para solucionar este inconveniente cree una clase que permite bloquear el formulario cada vez que un usuario va ha ejecutar alguna actualización sobre el mismo, basicamente el procedimiento a seguir es el siguiente.
1. Validar si el formulario esta siendo modificado.
2. Si no lo esta hacer checkout sobre el formulario para evitar que otros lo puedan modificar.
3. Ejecutar las operaciones de actualización sobre el formulario y guardar los cambios.
4. Hacer check-in del formulario para permitir que otros usuarios lo puedan actualizar.
Parte del código implementado para esta solución aparece a continuación, si desean ver la solución completa me envían un mail.
Antes de ejecutar los pasos mencionados se debe obtener el objeto spitem que apunta al item de la libreria al cual esta asociado el formulario que vamos a modificar mediante el uso de los objetos SPSite, SPWeb y SPList.
//Codigo que permite bloquear el formulario
mySite.AllowUnsafeUpdates = true;
myWeb.AllowUnsafeUpdate = true;
if (!(MyItem.File.CheckOutStatus == SPFile.SPCheckOutStatus.None))
{
MyItem.File.CheckOut();
}
//Codigo que permite desbloquear el formulario
MyItem.File.Checkin("Comentario");
Algo en lo cual se debe pensar es que se va hacer si llega un usuario a modificar el formulario y lo encuentra bloqueado por otro ... aquí básicamente se pueden hacer dos cosas una es simplemente mostrarle un mensaje al usuario diciendo que no puede modificar el formulario por otro usuario lo tiene bloqueado esta seria la salida más fácil, la segunda salida sería ir encolando las solicitudes y una vez un usuario termina de actualizar el formulario lo va tomando el siguiente en la fila, buena esta implementación espero publicarla más adelante ... si alguien se ha topado con este problema y ha encontrado una solución interesante diferente a la que expongo, le agradecería la comentara
Suscribirse a:
Entradas (Atom)