viernes, 11 de noviembre de 2011

System.Web.HttpRequestValidationException: A potentially dangerous Request

El Error:
System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (Trama="<?xml version='1.0' ...").
   at System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection)
   at System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection)
   at System.Web.HttpRequest.get_Form()
   at System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request)
   at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()


Ocurrió cuando trate de invocar un Método Web en modo POST
donde Trama era una cadena XML con etiquetas de apertura y cierre.

La solución es simplemente agregar al web.config las siguientes lineas:
Por cierto: El servicio fue hecho con Visual Studio 2010.





miércoles, 9 de noviembre de 2011

Error HTTP 500.21 - Internal Server Error

Error HTTP 500.21 - Internal Server Error
El controlador "WebServiceHandlerFactory-Integrated" tiene una condicion previa incorrecta "ManagedPipelilneHandler" en su lista de modulos

Este error ocurrió cuando trate de publicar un aplicativo web sobre mi PC con windows 7.
Para lo cual teniendo previamente instalado el Visual Studio 2010, instale el IIS 7.0, a través del panel de control agregando características de Windows.
El error obtenido al hacer la publicación fue el siguiente.
Hago la aclaración que antes de este error obtenía este error:
Este error ya fue resulto en otro post.

Solución Erro HHTP 500.21:
Luego de verificar que el sitio esta trabajando con correcto pool de aplicaciones.

Tal como se ve en la imagen, el sitio esta correctamente configurado para trabajar con .Net Framework 4.0
Y si el error persiste.
Entonces es necesario ejecutar el comando: aspnet_regiis -i
Para lo cual accedermos a Command Prompt de Visual Studio 2010.

Y ejecutamos el comando.
Demás esta decirles que deben ejecutarse como administrador.
En en el caso que esto ocurra en el servidor donde generalmente no instalamos Visual Studio 2010, tenemos que buscar la ubicación de aspnet_regiis.exe y ejecutar el comando.

lunes, 7 de noviembre de 2011

Infopath mostrar links como popup de sharepoint.

Sharepoint mejoró mucho la navegación con el uso de popups.
Para los que utilizamos InfoPath habilitado para web, nos llevamos la desilucion que los links se abren en una ventana nueva, cosa que funcionalmente hablando no es algo critico, pero por mantener el estándar de SharePoint, seria ideal que se consiga el mismo efecto con los formularios InfoPath.
Después de darle vueltas al tema y ya conociendo la función EditItem2 que SharePoint 2010 nos proporciona, la solución seria enfocado por ese lado.
La solución propuesta es una mala practica porque modifica archivos que no se recomienda tocar, porque genera problemas de escalabilidad porque cuando pasemos a la siguiente versión de Sharepoint 20**, ese archivo sera reemplazado, pero en el peor de los casos no deberá ocasionar problemas, solo que no tendrá el efecto que estamos implementando.
Sí con todas estas advertencias deseas continuar será bajo tu responsabilidas.
La idea es simple, mediante jquery reemplazar los href por onclick que invoque a la función EditItem2 propia de Sharepoint.
El código js la escribiremos en FormServer.aspx (ubicado en: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS) esto con la finalidad de hacer la solución lo mas general posible y la tengamos disponible para todos los formularios Infopath.
Noten también que estamos agregando 2 referencias a JQuery y que han sido colocados en la carpeta LAYOUTS, de esta formar estos archivos serán accesidos desde cualquier ubicación de Sharepoint.
Como en la pagina de FormServer.aspx, hay varios contenedores y no en todos queremos aplicar la conversion de href a onclick, definimos la región donde haremos la búsqueda. #FormControl__XmlFormView, ademas excluimos a los links que se utilizan para mostrar los calendarios.

Esto funciona de maravillas cuando carga, el problema es que si tenemos controles que hacen PostBack, esto deja sin efecto los cambios de href a onclick, para lo cual debemos volver a convertir los links.
Es aquí donde utilizamos la función everyTime, para que cada segundo busque algún link y haga el reemplazo correspondiente.

El resultado es el siguiente:

Aun hay cosas que pueden mejorarse, como colocar el código en un archivo y sólo hacer una referencia desde FormServer.aspx.
Espero esto solucione algún requerimiento o problema que tengan.

viernes, 4 de noviembre de 2011

Sharepoint 2010 Popup

Como ya muchos hemos notado, la versión de sharepoint 2010, ha mejorado muchísimo la parte visual, incluyendo en casi todas las paginas el uso de popup, sobre todo para la creación, modificación de items de una lista.
Pero esta funcionalidad puede ser reutilizada para que los link personalizados también funcionen de esta manera.


De manera que pudiera mostrar cualquier información tal como se muestra en el ejemplo.
Pues realmente es muy simple.
Sharepoint utiliza una función javascript para este fin:
EditItem2(event, "http://sharepoint-net.blogspot.com/")
Esto obviamente debera ser utilizado en implementaciones como webpart que obtengan una url y dinamicamente se pinte una lista con cada uno de los links.
En la siguiente entrada programare un pequeño webpart o .js para hacer uso de esto.
Saludos.
Marco Diaz

jueves, 19 de noviembre de 2009

InfoPath cannot start Microsoft Visual Studio Tools for Applications

Cuando trate de programar un boton de un formulario infopath obtuve este error


Ocurre porque al momento de instalar el Infopath 2007 dejamos la configuracion por defecto, esta no incluye VSTA (Visual Studio Tools for Applications)
Para solucionarlo solo debemos instalar este complemento: Colocar el CD del office seleccionar agregar o quitar complementos y seleccionar la opcion de VSTA, tal como se muestra en la imagen.

Esto soluciona el problema.

viernes, 13 de noviembre de 2009

Javascript DOM insertAfter

Las funciones de JavaScript DOM no incluyen una función de InsertAfter.

function insertAfter( referenceNode, newNode )
{

referenceNode.parentNode.insertBefore( newNode, referenceNode.nextSibling );

}


Ver pagina del Autor

domingo, 1 de noviembre de 2009

WebPart: People Selector

Sharepoint provee por defecto muchos WebPart tipo filtro, pero tengo la impresion de que olvidaron uno importante, un filtro que permita seleccionar personas o grupos finalmente que esto sea configurable, pero vamos por parte, inicialmente que permita seleccionar una persona o grupo, pero ademas de poder seleccionarlo que permita conectar con otros Webpart.
El primer obstaculo es conseguir una interface muy similar a la que el usuario esta acostumbrado: tenemos 2 opciones:

Contact Selector


People Selector


De ambas opciones yo prefiero el people selector, porque ya nativo del Sharepoint.
Haremos un webpart, usando el template que nos proporciona WSPBuilder, herramienta que podemos descargar de codeplex.
Crearemos un proyecto Provider que sera nuestro People Selector y un Consumer que solo sera demostrativo.


using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint.WebPartPages;
using System.Web.UI.WebControls;
using System.Collections.ObjectModel;
using Microsoft.SharePoint.WebControls;

namespace FilterProvider
{
[Guid("5a74bba3-4f58-46b2-a988-401ecc3ecf58")]
public class FilterProvider : Microsoft.SharePoint.WebPartPages.WebPart, ITransformableFilterValues
{
private bool _error = false;
private PeopleEditor _PeopleEditor;
private Button _Button;

public FilterProvider()
{
this.ExportMode = WebPartExportMode.All;
}

///
/// Create all your controls here for rendering.
/// Try to avoid using the RenderWebPart() method.
///

protected override void CreateChildControls()
{
if (!_error)
{
try
{

base.CreateChildControls();
_PeopleEditor = new PeopleEditor();
_PeopleEditor.MultiSelect = true;
_PeopleEditor.AutoPostBack = false;
_Button = new Button();
_Button.Text = "Consultar Datos";
_Button.Click += new EventHandler(_Button_Click);
this.Controls.Add(_PeopleEditor);
this.Controls.Add(_Button);

// Your code here...
this.Controls.Add(new LiteralControl(this.MyProperty));
}
catch (Exception ex)
{
HandleException(ex);
}
}
}

///
/// Ensures that the CreateChildControls() is called before events.
/// Use CreateChildControls() to create your controls.
///

///


protected void _Button_Click(object sender, EventArgs e)
{
List people = new List();
for (int i = 0; i <>
/// Clear all child controls and add an error message for display.
///

///
private void HandleException(Exception ex)
{
this._error = true;
this.Controls.Clear();
this.Controls.Add(new LiteralControl(ex.Message));
}

[ConnectionProvider("People", "UniqueIDForPeopleConnection", AllowsMultipleConnections = true)]
public ITransformableFilterValues SetConnection() { return this; }

#region Miembros de ITransformableFilterValues

bool ITransformableFilterValues.AllowAllValue
{
get { return true; }
}

bool ITransformableFilterValues.AllowEmptyValue
{
get { return false; }
}

bool ITransformableFilterValues.AllowMultipleValues
{
get { return true; }
}

string ITransformableFilterValues.ParameterName
{
get { return "People"; }
}

System.Collections.ObjectModel.ReadOnlyCollection ITransformableFilterValues.ParameterValues
{
get {

EnsureChildControls();
List people = new List();
for (int i = 0; i <> result = new ReadOnlyCollection(people);
return result;

}
}
#endregion
}
}

De todo esto lo mas interensate es:
017 private PeopleEditor _PeopleEditor;
Que nos permite reutilizar visual y funcionalmente el control People Editor que nos proporciona Sharepoint para sus columnas tipo Person/Group

077 [ConnectionProvider("People", "UniqueIDForPeopleConnection", AllowsMultipleConnections = true)]
078 public ITransformableFilterValues SetConnection() { return this; }

102 System.Collections.ObjectModel.ReadOnlyCollection ITransformableFilterValues.ParameterValues
Estas funciones permite dar la funcionalidad de Filtro a nuestro WebPart.
En este caso hemos hecho un filtro multi valores, segun las necesidades puede ser modificado.
Ahora el Consumer.

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint.WebPartPages;

namespace FilterConsumer
{
[Guid("b9e3fb99-7c6b-4386-b7c1-5fcc37f01740")]
public class FilterConsumer : Microsoft.SharePoint.WebPartPages.WebPart
{
private bool _error = false;
private List _filterProviders;
private List FilterProviders {
get
{
return _filterProviders;
}
}

public FilterConsumer()
{
_filterProviders = new List();
}

///
/// Create all your controls here for rendering.
/// Try to avoid using the RenderWebPart() method.
///

protected override void CreateChildControls()
{
if (!_error)
{
try
{

base.CreateChildControls();

// Your code here...
this.Controls.Add(new LiteralControl(this.MyProperty));
}
catch (Exception ex)
{
HandleException(ex);
}
}
}

///
/// Ensures that the CreateChildControls() is called before events.
/// Use CreateChildControls() to create your controls.
///

///
protected override void OnLoad(EventArgs e)
{
if (!_error)
{
try
{
base.OnLoad(e);
this.EnsureChildControls();

// Your code here...
}
catch (Exception ex)
{
HandleException(ex);
}
}
}

///
/// Clear all child controls and add an error message for display.
///

///
private void HandleException(Exception ex)
{
this._error = true;
this.Controls.Clear();
this.Controls.Add(new LiteralControl(ex.Message));
}

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
foreach (IFilterValues filter in FilterProviders)
{ writer.WriteLine(string.Format("Parameter: {0}
", filter.ParameterName));
if (filter.ParameterValues != null)
{
foreach (string value in filter.ParameterValues)
if (!string.IsNullOrEmpty(value))
writer.WriteLine(string.Format(" value: {0}
", value));
}
}
base.Render(writer);
}

[ConnectionConsumer("filter", "UniqueIDForConsumer", AllowsMultipleConnections = true)]
public void SetFilter(IFilterValues filterValues) {
if (filterValues != null) {
EnsureChildControls();
List parameters = new List();
parameters.Add(new ConsumerParameter("People", ConsumerParameterCapabilities.SupportsMultipleValues | ConsumerParameterCapabilities.SupportsAllValue));
//parameters.Add(new ConsumerParameter("Status", ConsumerParameterCapabilities.SupportsMultipleValues | ConsumerParameterCapabilities.SupportsAllValue));
filterValues.SetConsumerParameters(new System.Collections.ObjectModel.ReadOnlyCollection(parameters));
this.FilterProviders.Add(filterValues);
}
}
}
}

De igual manera tenemos que recuperar los datos que el provider nos envia.
100 [ConnectionConsumer("filter", "UniqueIDForConsumer", AllowsMultipleConnections = true)]
101 public void SetFilter(IFilterValues filterValues)

Finalmente deberiamos obtener algo como esto: