Saturday, April 25, 2009

Sharepoint List … Programáticamente

Hola de nuevo, y esta vez quiero mostrar un sencillo ejemplo de cómo podemos guardar información en una lista previamente configurada en Sharepoint.

Suponiendo que tenemos una página aspx en la cual programamos una interfaz adecuada para ingresar los valores y posteriormente guardarlos en la lista, el código de ejemplo quedaría de la siguiente forma:

Protected Sub btnGuardar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnGuardar.Click
        SPSecurity.RunWithElevatedPrivileges(AddressOf Guardar)
    End Sub

    Private Sub Guardar()
        Dim objSitio As SPSite = New SPSite(ConfigurationManager.AppSettings("MiSitio"))
        Using objWeb As SPWeb = objSitio.OpenWeb()
            objWeb.AllowUnsafeUpdates = True
            Dim objLista As SPList = objWeb.Lists("MiLista")
            Dim objItem As SPListItem = objLista.Items.Add()
            objItem("Campo 1") = "xxxx"
            objItem("Campo 2") = "yyyy"
            objItem.Update()
            objWeb.AllowUnsafeUpdates = False
        End Using

    End Sub

Lo primero y más importante es la llamada al método:

SPSecurity.RunWithElevatedPrivileges(AddressOf Guardar)
Con lo anterior aseguramos que un usuario que ha iniciado sesión en el sitio de Sharepoint pueda ejecutar la acción.

Ya en el método Guardar(), se supone que ya existe un sitio llamado MiSitio, con una lista en ese sitio llamada MiLista la cual tiene una serie de campos, Campo 1 y 2. Eso obviamente lo deben cambiar a sus valores reales.

Lo realmente importante es la llamada a la propiedad AllowUnsafeUpdates con el valor true, lo cual le dice a la Lista que debe quedar hábilitada para permitir la actualización cuando se invoca el método  Update().

Lo anterior, que conste que lo escribo en letra roja, es practicamente una impersonación, así que hasta el más razo de los usuarios (read only) podrá hacer una actualización sobre esa lista. Por lo tanto miren la llamada nuevamente a AllowUnsafeUpdates pero esta vez asignado a False, porque puede ser un hueco de seguridad lo anterior. Además si ustedes quieren que la actualización la pueda ejecutar únicamente un usuario con mayores privilegios pues es cuestión de adicionar código que valide el grupo o algo por el estílo que verifique los permisos de dicho usuario, ya que lo anterior lo puede ejecutar cualquiera.

Felíz Update.

Thursday, April 16, 2009

Windows Sharepoint Services Book – OnLine

Esto me dió gran sorpresa y entusiasmo que se comparta un preview de un libro tan maravilloso sobre la tecnología ya que para los que lo compramos desafortunadamente no trae una versión dígital o los que les interese comprarlo puedan darle un vistazo antes de. Afortunadamente como lo dije en un post anterior el libro vale mucho la pena por cada dolar invertido.

http://techbus.safaribooksonline.com/9780470127285/dear_reader

Felíz preview

Wednesday, April 15, 2009

El GridView programático … una triste história

Si han seguido un post anterior sobre el gridview programático notaron que todo marchó a pedir de boca.

Pero cuando habilité la paginación del gridview en la webpart apareció este engendro sobrenatural:

Server Error in '/' Application.

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.UI.WebControls.GridView.get_StateFormatter() +25


Lo anterior es lo ocurrido cuando el gridview queda configurado para paginación. ¿Pero cómo se logra el error anterior?



Antes





Protected Overrides Sub CreateChildControls() 
           Dim customField As New TemplateField 


            customField.ItemTemplate = New GridViewTemplate(DataControlRowType.DataRow, "", Me.Imagen, Me.Titulo, Me.Resumen, Me.Contenido) 
            grvPrueba = New GridView() 
             grvPrueba.AutoGenerateColumns = False             grvPrueba .ShowHeader = False             grvPrueba .RowStyle.CssClass = Me.EstiloFila             grvPrueba .AlternatingRowStyle.CssClass = Me.EstiloAlternado 
            If Paginar Then 
                grvPrueba .AllowPaging = Paginar 
                If Me.NumeroRegistros > 0 Then 
                    grvPrueba .PageSize = Me.NumeroRegistros 
                End If 
            End If 
            grvPrueba.Columns.Add(customField) 
            grvPrueba.DataSource = ConsultarLista() 
            grvPrueba.DataBind() 
            AddHandler grvPrueba.PageIndexChanging, AddressOf grvPrueba_PageIndexChanging 
Me.Controls.Add(grvNoticias) 
        End Sub


¿Si han notado que dejo para el final el agregar el gridview a la colección Controls de la webpart? Pues eso es un grave error cuando el gridview permitirá la paginación y cuesta un par de tasas de café y una tarde entera de trabajo perdido. El por qué del error, creo quedo en deuda con la explicación de fondo porque no sé la razón.



Solución



En seguida de la creación del GridView este se debe agregar a la colección Controls de tal forma que nos queda así:



grvPrueba= New GridView()

Me.Controls.Add(grvPrueba)




Feliz GridView programático

Wednesday, April 08, 2009

Una luz en el tunel … Guía Sharepoint

Quiero para los que no sepan que existe una guía de Patterns & Practices para Sharepoint darles el siguiente link:

http://msdn.microsoft.com/en-us/library/dd203468.aspx

Es muy bueno sentarse a revisar esto antes de tomar desiciones sobre la arquitectura y desarrollos para Sharepoint.

Y aprovechando esta entrada también darles el link a la revista de Sharepoint en español que me parece una grandiosa entrega del tema.

http://www.gavd.net/servers/compartimoss/compartimoss_main.aspx

Felíz arquitectura

TemplateField el Gridview programático

Teniendo que hacer una WebPart para WSS 3.0 necesitaba incluir un Gridview como control de la webpart pero con controles dentro de el como lo podemos hacer desde el diseñador de visual studio.

<asp:GridView ID="gvWebPart" runat="server" AutoGenerateColumns="false">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <div>
                                  <asp:HyperLink  ID="lblContenido" runat="server" Text='<%# Bind("campo")  %>'   ></asp:HyperLink>
                                    </div>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>

Pero lo anterior solo se logra en un proyecto de tipo ASP.NET, pero en un proyecto tipo Webpart? La respuesta está aquí igualmente para cualquier otro proyecto donde no podemos hacer lo anterior vía el diseñador:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.templatefield.templatefield.aspx

Felíz Gridview programático