Mostrando las entradas con la etiqueta Programación SharePoint. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Programación SharePoint. Mostrar todas las entradas

miércoles, 20 de julio de 2016

Error Attempted to perform an unauthorized operation al intentar obtener el nombre de un grupo de SharePoint 2010

Este error da porque se esta ejecutando una operación no autorizada y a pesar que utilizamos el método RunWithElevatedPrivileges de la clase SPSecurity ya que  invocamos la propiedad RoleAssigments de la biblioteca.  Este código esta corriendo sobre un EventReceiver a través de la clase SPItemEventReceiver que tiene sus peculiaridades a comparación del desarrollo de elementos Web en SharePoint.
 
 
 
Veamos el siguiente código:
 
 
 
 
Fue reemplazado por el siguiente código:
 
 

 
Aunque el código no reemplaza totalmente la lógica anterior si obtiene de forma directa el nombre del grupo que en el caso de la solución aplicaba efectivamente lo que se deseaba.
 
Lo que se hizo en el código es obtener los grupos del usuario actual a los cuales pertenece y que tiene la palabra lector. Que era fundamentalmente lo que se requería en la aplicación.
 
Así que ojo no den por sentado cuando utilizan SPSecurity.RunWithPriviliges(); que todo se ejecuta con el usuario administrador dentro del código primordialmente en un entorno como El EventReceiver.
 
 Así que Code4Fun!,
 
Juan Manuel Herrera Ocheita
 

jueves, 30 de junio de 2016

[RETURN TO BASICS] Modificando en un solo lugar el codigo a través de la asignación de variables

La refactorización (del inglés refactoring) es una técnica de la ingeniería de software para reestructurar un código fuente, alterando su estructura interna sin cambiar su comportamiento externo.  (Extraído de wikipedia)

Esta técnica establece la forma de realizar cambios que mejoran a lo interno el código sin afectar su comportamiento externo, con el objetivo que el código sea mas fácil de cambiar y entender.

Este código está escrito en C# y es una solución de granja de SharePoint.

A continuación un segmento de código que evaluaremos en este caso:

 public string ObtenerLeyendaMaterialEstudioDerechosReservados()
        {
            var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);

            if (valorRetornado != null) return valorRetornado.Valor;
            _configuracionRepositorio.CrearLlave(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);
            valorRetornado = _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;

            return valorRetornado.Valor;

        }

A primera vista podríamos valorar que no requiere ninguna mejora y que lo que hace básicamente es obtener un valor y validar si es nulo crear este valor para luego retornarlo.  Pero cuadno el código se repite hay una oportunidad de mejora siempre dentro del código.

Si observamos detenidamente hay una referencia que se repite 3 veces y es la siguiente:

_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados

Y si por algún motivo necesitamos cambiar esta referencia tendriamos que modificar 3 líneas de código.  Pero el número de veces hacerlo no esta tan grande, pero el error si puede suceder si no cambiamos las 3.  

Entonces vez de cambiarla 3 veces podemos asignarla a una variable y luego reemplazar esta variable donde hace referencia por lo que si la referencia cambia solo la cambiamos una vez de la siguiente forma:

public string ObtenerLeyendaMaterialEstudioDerechosReservados()
        {
            var leyenda _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;
            var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(leyenda);

            if (valorRetornado != null) return valorRetornado.Valor;
            _configuracionRepositorio.CrearLlave(leyenda);
            valorRetornado = leyenda;

            return valorRetornado.Valor;

        }

Y eso es todo amigos, por esta vez.  No solo es bueno tener buenas herramientas como Visual Studio y componentes de terceros como RSharper sino importante que escribamos código legible y que sea fácil de mantener.

Code4Fun!,

Juan Manuel Herrera Ocheita 

[RETURN TO BASICS] Modificando en un solo lugar el codigo a través de la asignación de variables

La refactorización (del inglés refactoring) es una técnica de la ingeniería de software para reestructurar un código fuente, alterando su estructura interna sin cambiar su comportamiento externo.  (Extraído de wikipedia)

Esta técnica establece la forma de realizar cambios que mejoran a lo interno el código sin afectar su comportamiento externo, con el objetivo que el código sea mas fácil de cambiar y entender.

Este código está escrito en C# y es una solución de granja de SharePoint.

A continuación un segmento de código que evaluaremos en este caso:

 public string ObtenerLeyendaMaterialEstudioDerechosReservados()
        {
            var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);

            if (valorRetornado != null) return valorRetornado.Valor;
            _configuracionRepositorio.CrearLlave(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);
            valorRetornado = _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;

            return valorRetornado.Valor;

        }

A primera vista podríamos valorar que no requiere ninguna mejora y que lo que hace básicamente es obtener un valor y validar si es nulo crear este valor para luego retornarlo.  Pero cuadno el código se repite hay una oportunidad de mejora siempre dentro del código.

Si observamos detenidamente hay una referencia que se repite 3 veces y es la siguiente:

_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados

Y si por algún motivo necesitamos cambiar esta referencia tendriamos que modificar 3 líneas de código.  Pero el número de veces hacerlo no esta tan grande, pero el error si puede suceder si no cambiamos las 3.  

Entonces vez de cambiarla 3 veces podemos asignarla a una variable y luego reemplazar esta variable donde hace referencia por lo que si la referencia cambia solo la cambiamos una vez de la siguiente forma:

public string ObtenerLeyendaMaterialEstudioDerechosReservados()
        {
            var leyenda _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;
            var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(leyenda);

            if (valorRetornado != null) return valorRetornado.Valor;
            _configuracionRepositorio.CrearLlave(leyenda);
            valorRetornado = leyenda;

            return valorRetornado.Valor;

        }

Y eso es todo amigos, por esta vez.  No solo es bueno tener buenas herramientas como Visual Stuidio y componentes de terceros como RSharper sino importante que escribamos código legible y que sea fácil de mantener.

Code4Fun!,

Juan Manuel Herrera Ocheita 

[RETURN TO BASICS] Modificando en un solo lugar el codigo a través de la asignación de variables

La refactorización (del inglés refactoring) es una técnica de la ingeniería de software para reestructurar un código fuente, alterando su estructura interna sin cambiar su comportamiento externo.  (Extraído de wikipedia)

Esta técnica establece la forma de realizar cambios que mejoran a lo interno el código sin afectar su comportamiento externo, con el objetivo que el código sea mas fácil de cambiar y entender.

Este código está escrito en C# y es una solución de granja de SharePoint.

A continuación un segmento de código que evaluaremos en este caso:

 public string ObtenerLeyendaMaterialEstudioDerechosReservados()
        {
            var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);

            if (valorRetornado != null) return valorRetornado.Valor;
            _configuracionRepositorio.CrearLlave(_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados);
            valorRetornado = _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;

            return valorRetornado.Valor;

        }

A primera vista podríamos valorar que no requiere ninguna mejora y que lo que hace básicamente es obtener un valor y validar si es nulo crear este valor para luego retornarlo.  Pero cuadno el código se repite hay una oportunidad de mejora siempre dentro del código.

Si observamos detenidamente hay una referencia que se repite 3 veces y es la siguiente:

_configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados

Y si por algún motivo necesitamos cambiar esta referencia tendriamos que modificar 3 líneas de código.  Pero el número de veces hacerlo no esta tan grande, pero el error si puede suceder si no cambiamos las 3.  

Entonces vez de cambiarla 3 veces podemos asignarla a una variable y luego reemplazar esta variable donde hace referencia por lo que si la referencia cambia solo la cambiamos una vez de la siguiente forma:

public string ObtenerLeyendaMaterialEstudioDerechosReservados()
        {
            var leyenda _configuracionAplicacion.LeyendaMaterialEstudioDerechosReservados;
            var valorRetornado = _configuracionRepositorio.ObtenerConfiguracionPorId(leyenda);

            if (valorRetornado != null) return valorRetornado.Valor;
            _configuracionRepositorio.CrearLlave(leyenda);
            valorRetornado = leyenda;

            return valorRetornado.Valor;

        }

Y eso es todo amigos, por esta vez.  No solo es bueno tener buenas herramientas como Visual Stuidio y componentes de terceros como RSharper sino importante que escribamos código legible y que sea fácil de mantener.

Code4Fun!,

Juan Manuel Herrera Ocheita 

[RETURN TO BASICS]Sabias que Error List en VS te sirve para validar el codigo sin necesidad de compliar

Como  desarrollador y en especial en SharePoint que no es un ambiente muy amigable sino complejo lleno de experiencias y sin sabores iniciaré una serie de post sobre buenas prácticas de programación  y el uso de funcionalidades en Visual Studio que pasamos a veces desapercibidas.  También veremos  formas de resolver en código los problemas que se encuentran en el día a día del desarrollo de soluciones la cual lo he denominado [RETURN TO BASICS] .

El siguiente ejemplo esta escrito en C# y es una solución de granaja en SharePoint.

Visual Studio tiene una ventana llamada Error List y es muy util cuando modificas código donde hay un error sin necesidad de compliar nuevamente.

Miremos esta imagen de abajo

En esta imagen nos muestra el error solo tenemos que hacer clic sobre la fila del error y nos llevará al código donde esta el problema.

Y lo que me indica el error es que no hay un argumento que corresponda al parámetro formal requerido y efectivamente modifique el método para que recibiera un nuevo parámetro y en la llamada no lo estoy colocando entonces automáticamente me lleva al código donde esta el método y allí adiciono el parámetro de la siguiente manera:

var materialEstudioDerechosReservados = ConfiguracionServicio.ObtenerLeyendaMaterialEstudioDerechosReservados();

_vista.MostrarMaterialesEstudio(requisitos.DocumentosBibliotecaMaterialesEstudio, materialEstudioDerechosReservados);

Por qué declarar una variable y luego pasarla como parámetro en vez de invocar el método.  Porque debemos de pensar en cuando haya un error es más fácil ubicar lo de esta forma.  Entre más desacoplemos el código mejor para escribir pruebas unitarias y facilitar el hallazgo el error.

Si vemos la lista de errores de Visual Studio veremos que ya desapareció el error y no tuve que compliar de nuevo estos son segundos valiosos que nos ahorramos por cada cambio que realizamos.



Eso es todo amigos, en este post demostré el uso de la ventana Error List de Visual Studio la cual nos ayuda a resolver los errores que podamos encontrar cuando modificamos el código sin necesidad de compilar el proyecto o la solución.

Code4Fun!,

Juan Manuel Herrera Ocheita

lunes, 23 de mayo de 2016

Como resolver el Error /_vti_bin/client.svc/ProcessQuery UnauthorizedAccessException: Access is denied.

Escenario:

Una app de SharePoint o Add-in de SharePoint como Microsoft denomina ahora las apps en SharePoint dejo repentinamente de desplegar a todos los usuarios el contenido del app.

Esto no solo aplica a las apps sino a cualquier lista dentro de la Aplicación web de SharePoint, como veremos más adelante.  Así que si repentinamente dejo de ver un contenido pueda que este sea su caso.

El usuario me notificó que al agregar el usuario de red como administrador local del servidor, ya le mostraba el contenido del app.   Aún más confuso y extraño este comportamiento que al parecer eran permisos que no tenían los usuarios en el servidor, pero como descubrir si alguien hizo alguna modificación en el servidor ya que es un ambiente de un cliente administrador por el personal del cliente.

Después de revisar la configuración y servicios de Aplicaciones de la granja de SharePoint y constatar que todo estaba bien configurado y funcionando, procedí a indagar en los logs de SharePoint.   Para ello es necesario habilitar los siguientes eventos:



Y esto fue lo que obtuve en el log:
System.UnauthorizedAccessException: Access is denied. (Excepción de HRESULT: 0x80070005 (E_ACCESSDENIED))     en Microsoft.SharePoint.SPGlobal.HandleUnauthorizedAccessException(UnauthorizedAccessException ex)     en Microsoft.SharePoint.Library.SPRequest.UpdateField(String bstrUrl, String bstrListName, String bstrXML)     en Microsoft.SharePoint.SPField.UpdateCore(Boolean bToggleSealed)     en Microsoft.SharePoint.ServerStub.SPFieldServerStub.InvokeMethod(Object target, String methodName, XmlNodeList xmlargs, ProxyContext proxyContext, Boolean& isVoid)     en Microsoft.SharePoint.Client.ServerStub.InvokeMethodWithMonitoredScope(Object target, String methodName, XmlNodeList args, ProxyContext proxyContext, Boolean& isVoid)     en Microsoft.SharePoint.Client.ClientMethodsProcessor.InvokeMeth... d7c57d9d-5788-b0d0-3f2a-a19b4191ed7d
05/19/2016 12:04:25.15* w3wp.exe (0x3E6C)                       0x34F8 SharePoint Foundation         CSOM                           aiv4i High     ...pdate" Id="348" ObjectPathId="272" />List of all employees.
d7c57d9d-5788-b0d0-3f2a-a19b4191ed7d
05/19/2016 12:04:25.15* w3wp.exe (0x3E6C)                       0x34F8 SharePoint Foundation         CSOM                           aiv4i High     ...ldItemQuery>
http://app-369d6491a3e5c7.apps.bantrabgf.local/InfowareForgetNotEmployees d7c57d9d-5788-b0d0-3f2a-a19b4191ed7d
05/19/2016 12:04:25.15 w3wp.exe (0x3E6C)                       0x34F8 SharePoint Foundation         CSOM                           agmjp High     Original error: System.UnauthorizedAccessException: Access is denied.



Luego utilice Fiddler  para ver el tráfico de la aplicación:

Y me mostró la siguiente información:

Aunque el 401 es un mensaje de no autorizado es el comportamiento esperado con la autenticación ntlm ya que luego le sigue un 200 OK que indica que pudo realizar la acción solicitada.  Así que fiddler no me ayudo mucho en este caso.

La aplicación lo que hace es desplegar de una lista dentro del AppWeb el contenido, pero me estaba reportando un acceso denegado. No fue sino hasta que exporte la lista completa a excel que me percate que tenia 5008 elementos. Y esto me recordó el umbral de máximo de elementos por lista que tiene configuración SharePoint de forma predeterminada.  Y ahora hacía sentido que los usuarios administradores si podía ver el contenido ya que el umbral de los administradores y auditores es de 20,000 elementos.   

Solución:

Fue solo ampliar el umbral a nivel de aplicación web de 5,000 elementos a 10,000 elementos para que se pueda leer el contenido que no desplegaba.   Cómo hacerlo vea el siguiente enlace: http://stevemannspath.blogspot.com/2013/05/sharepoint-2013-list-view-threshold.html

Otras soluciones:

Depurar el listado de la lista, eliminando o filtrando el contenido ver este enlace:

http://en.share-gate.com/blog/demystifying-the-sharepoint-lists-thresholds

O bien modificando el código para que lea de forma filtrada.

https://blogs.msdn.microsoft.com/ericwhite/2009/11/20/using-the-sharepoint-2010-managed-client-object-model-accessing-large-lists/

Eso esto amigos, un día mas en las aguas profundas de SharePoint World!

Saludos,

Juan Manuel Herrera Ocheita

sábado, 30 de abril de 2016

Asignando valor predeterminado a una propiedad de un elemento Web de forma declarativa SharePoint 2013

Asignando valor predeterminado a una propiedad de un elemento Web de forma declarativa SharePoint 2013





Para agregar un valor predeterminado a una propiedad de un elemento web debemos de ir al código de servidor o Code Behind del control de usuario, como se muestra en la imagen de abajo.

Debemos definir una propiedad pública de la clase del control de usuario.  Y agregar los atributos: WebBrowsable,WebDisplayName, WebDescription,Category y Personalizable, como se muestra en el código de abajo.

Luego vamos a definir un módulo dentro del proyecto, esto nos permitirá adicionar páginas y elementos web a las páginas cuando se instale la solución y agregar el valor predeterminado a la propiedad.




Luego creamos una Application Page como plantilla para entonces crear una instancia de la página donde definamos el elemento web.




En la página se define las zonas de los elementos web para poner distribución de los elementos Web dentro de la página.




Ahora vamos a modificar el archivo elements.xml donde se define la instancia de la página y los elementos web dentro de ella.


     


Y través del nodo properties, definimos los nombres de cada propiedad con su respectivo valor.

Y eso es todo!

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

sábado, 26 de diciembre de 2015

Analizando como podemos consumir SharePoint OData con javascript

Pienso que es interesante las pruebas que realice para validar lo que me devuelve el servicio de Odata de SharePoint Online.

Cree una lista personalizada de SharePoint llamada Banners y adicione un par de columnas Url y Link.

Y el contenido es el siguiente: un solo elemento con una image y un enlace.


Si consumimos el servicio enviando la siguiente instrucción con jquery:
 
Lo que me devuelve al consumir json es lo siguiente:
{"odata.metadata":"https://infowareplus.sharepoint.com/sites/prueba/_api/$metadata#SP.ListData.BannersListItems"
,"value":[{"odata.type":"SP.Data.BannersListItem"
,"odata.id":"0589cb7b-2bb2-4ced-a7ea-704cd8e0dcea"
,"odata.etag":"\"4\""
,"odata.editLink":"Web/Lists(guid'2b6b9d83-4eeb-4716-86e4-5f6ee03a577e')/Items(1)"
,"FileSystemObjectType":0
,"Id":1
,"ContentTypeId":"0x01002C49C3B57506B541ABE2A829193FF712"
,"Title":"Noticias"
,"Imagen":{"Description":"Evento"
,"Url":"https://infowareplus.sharepoint.com/sites/prueba/SiteAssets/EventoMicrosoftAzureComunidadTecnica2.jpg"}
,"Link":{"Description":"Dirección de Prueba"
,"Url":"http://www.google.com"}
,"ID":1
,"Modified":"2015-12-14T19:54:56Z"
,"Created":"2015-12-10T20:47:48Z"
,"AuthorId":9
,"EditorId":9
,"OData__UIVersionString":"1.0"
,"Attachments":false
,"GUID":"f6a6e965-8f1a-436e-86c8-682e4f6368d5"}]}
Ahora observemos la siguiente prueba a tavés de javascript:





Create Object from JSON String













Lo que nos devuelve es lo siguiente:
{"odata.metadata":"https://infowareplus.sharepoint.com/sites/PRUEBA/_api/$metadata#SP.ListData.BannersListItems","value":[{"odata.type":"SP.Data.BannersListItem","odata.id":"0589cb7b-2bb2-4ced-a7ea-704cd8e0dcea","odata.etag":"'4'","odata.editLink":"Web/Lists(guid\'2b6b9d83-4eeb-4716-86e4-5f6ee03a577e\')/Items(1)","FileSystemObjectType":0,"Id":1,"ContentTypeId":"0x01002C49C3B57506B541ABE2A829193FF712","Title":"Noticias","Imagen":{"Description":"Evento","Url":"https://infowareplus.sharepoint.com/sites/prueba/SiteAssets/EventoMicrosoftAzureComunidadTecnica2.jpg"},"Link":{"Description":"Dirección de Prueba","Url":"http://www.google.com"},"ID":1,"Modified":"2015-12-14T19:54:56Z","Created":"2015-12-10T20:47:48Z","AuthorId":9,"EditorId":9,"OData__UIVersionString":"1.0","Attachments":false,"GUID":"f6a6e965-8f1a-436e-86c8-682e4f6368d5"}]}
Si accedemos  a la propiedad odata.detadata:
var obj = JSON.parse(text);
document.getElementById("demo2").innerHTML = obj["odata.metadata"];
Me retorna lo siguiente:
https://infowareplus.sharepoint.com/sites/prueba/_api/$metadata#SP.ListData.BannersListItems
Si accedemos la propiedad value obtendremos otro objeto de json que podemos acceder sus propiedades, de la siguiente forma:
var obj2 = obj["value"];
document.getElementById("demo3").innerHTML = obj2[0]["odata.type"];

Lo que nos retorna es lo siguiente:
SP.Data.BannersListItem
Asi podemos obtener otros atributos:
document.getElementById("demo4").innerHTML = obj2[0]["odata.id"];
document.getElementById("demo5").innerHTML = obj2[0]["odata.etag"];
document.getElementById("demo6").innerHTML = obj2[0]["odata.editLink"];
Lo que nos retorna es lo siguiente:
0589cb7b-2bb2-4ced-a7ea-704cd8e0dcea
'4'
Web/Lists(guid'2b6b9d83-4eeb-4716-86e4-5f6ee03a577e')/Items(1)
Y por ultimo vamos acceder la propiedad Imagen y Link de la siguiente forma:
var obj3 = obj2[0]["Imagen"];
document.getElementById("demo7").innerHTML = obj3["Url"];
var obj4 = obj2[0]["Link"];
document.getElementById("demo8").innerHTML = obj4["Url"];
Y los resultados serán las URL siguientes:
https://infowareplus.sharepoint.com/sites/PRUEBA/SiteAssets/EventoMicrosoftAzureComunidadTecnica2.jpg
http://www.google.com
Bueno como vemos podemos acceder con javascript la información que me devuelve el servicio OData de SharePoint, y como esta construído la estructura de datos de una lista Personalizada de SharePoint.  Para que observemos mejor la estructura lo mostraré de la siguiente forma:
'{
"odata.metadata":"https://infowareplus.sharepoint.com/sites/prueba/_api/$metadata#SP.ListData.BannersListItems"
,"value":[
     {"odata.type":"SP.Data.BannersListItem"
     ,"odata.id":"0589cb7b-2bb2-4ced-a7ea-704cd8e0dcea"
     ,"odata.etag":"\'4\'"
     ,"odata.editLink":"Web/Lists(guid\'2b6b9d83-4eeb-4716-86e4-5f6ee03a577e\')/Items(1)"
     ,"FileSystemObjectType":0
     ,"Id":1
     ,"ContentTypeId":"0x01002C49C3B57506B541ABE2A829193FF712"
     ,"Title":"Noticias"
     ,"Imagen":{"Description":"Evento","Url":"https://infowareplus.sharepoint.com/sites/prueba/SiteAssets/EventoMicrosoftAzureComunidadTecnica2.jpg"}
     ,"Link":{"Description":"Dirección de Prueba" ,"Url":"http://www.google.com"}
     ,"ID":1
     ,"Modified":"2015-12-14T19:54:56Z"
     ,"Created":"2015-12-10T20:47:48Z"
     ,"AuthorId":9
     ,"EditorId":9
     ,"OData__UIVersionString":"1.0"
     ,"Attachments":false
     ,"GUID":"f6a6e965-8f1a-436e-86c8-682e4f6368d5"}
     ]
}'
Espero que con eso los haya ayudado a comprender la estructura de las listas en SharePoint en formato JSON.
Hasta la próxma,
Juan Manuel Herrera Ocheita
 

P.D. utilice para las pruebas el siguiente enlace: http://www.w3schools.com/json/tryit.asp?filename=tryjson_parse .

martes, 13 de octubre de 2015

Dando formato a una carta en un elemento Web de SharePoint

Hay veces que necesitamos construir el formato de una carta para ser desplegada en un elemento Web.  Para darle formato necesitamos escribir código HTML de forma dinámica y luego desplegarla al momento que elemento Web es cargado en la página de SharePoint.

image

Lo primero es definir un control asp.net Literal ya que este escribe exactamente lo que le enviemos sin realizar ninguna conversión, esto nos permitirá enviar código HTML dentro del texto.  Asi como se demuestra a continuación:

   <asp:Literal runat="server" ID="uiCarta"></asp:Literal>

En el código adyacente o Code Behind podemos encontrar la siguiente declaración.

public string Carta
       {
           set
           {
               uiCarta.Text = value;
           }
       }

Definimos una propiedad tipo String y definimos el valor a ingresar es para la propiedad Text del control Literal.

Para facilitar su comprensión asumiremos de la definición al obtendremos de codigo definido a continuacion.

var carta = @”

Señores

<b>[NombreUsuario]</b>

<br>

[Departamento]

<br><div style=”text-align:justify”>

Por este medio deseo indicarle…. blalablalallal

</div><br>

<table style=”width=100%;”>

<tr>

<td style=”width=50%;”>

Vo.Bo.

</td>

<td style=”width=50%;”>

Revisado

</td>

</tr>

</table>

”;

carta= carta.replace(“[Usuairo]”,SPContext.Current.Web.CurrentUser.Name).Replace(“[Departamento]”,userDepartmentVariable);

_vista.Carta = carta;

El Resultado es el siguiente:

image

Eso es todo.   Una solución sencilla para un requerimiento común.

Code4Fun!,

Juan Manuel Herrera Ocheita

miércoles, 16 de septiembre de 2015

Clases Fuertemente Tipados en una ListView para un WebPart en SharePoint

El control ListView nos permite desplegar colecciones de Clases definidas en codigo (Ej.:List<MiEntidad> ).  

Normalmente utlizamos el metodo Eval(“Atributo de la Clase”) para desplegar la información que enlazamos en el control con el evento miListView.DataBind().

Una mejor forma es utilizando el Atributo ItemType del control ListView.  De la siguiente forma:

<asp:ListView ID="uiListado" runat="server" ItemPlaceholderID="DetalleListado"
          OnPagePropertiesChanged="uiListado_PagePropertiesChanged"
          ItemType="Infoware.Comun.Dominio.Entidad.MiClase">

En el detalle lo definimos de la siguiente forma:

<ItemTemplate>
      <tr class="">
          <td id="Td2" runat="server"><%#: Item.Perfil %></td>
          <td id="Td3" runat="server"><%#: Item.Plazas %></td>
          <td id="Td4" runat="server"><%#: Item.Seccion %></td>
          <td id="Td10" runat="server"><%#: Item.Departamento %></td>
          <td id="Td7" runat="server"><%#: Item.PlazasTotal %></td>
          <td id="Td9" runat="server"> Del: <%#: Item.InscripcionesFechaInicial.HasValue? Item.InscripcionesFechaInicial.Value.ToString("dd/MM/yyyy"):"" %> 
              Al: <%#: Item.InscripscionesFechaFin.HasValue?Item.InscripscionesFechaFin.Value.ToString("dd/MM/yyyy"):"" %></td>
          <td id="Td8" runat="server"><%#: Item.InscripscionesFechaFin.HasValue? Item.InscripscionesFechaFin.Value.ToString("dd/MM/yyyy"):"" %></td>
           <td id="Td1" runat="server"><%#: Item.ExamenLugar %></td>
          <td id="Td5" runat="server"><%#: Item.TipoConvocatoria %></td>
        
          <td class="clasebotones">
              <asp:LinkButton ID="uiVer" runat="server"  ToolTip="Ver"
                  OnClick="evento_ver" CommandArgument='<%#: Item.Id %>' ValidationGroup='<%#: Item.CircularNo %>'
                  OnClientClick="javascript:setFormSubmitToFalse()">Circular PDF</asp:LinkButton>
           
              <asp:LinkButton ID="LinkButton3" runat="server"  ToolTip="Ver"
                  OnClick="evento_Recrear" CommandArgument='<%#: Item.Id %>' ValidationGroup='<%#: Item.CircularNo %>'
                  OnClientClick="javascript:setFormSubmitToFalse()">Recrear Circular PDF</asp:LinkButton>
          </td>
      </tr>
  </ItemTemplate>

Como podemos observar utilizamos la clase Item.NombreAtributoClaseDefiniaEnItemType.

image

Uselo es práctico y evita errores de escritura.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita