Buscar este blog

viernes, 28 de enero de 2011

Asp.net 4.0: Permitir captura de etiquetas html dentro de un textbox.


En escasas ocasiones dentro de nuestra aplicación web es necesario permitir que el usuario ingrese cierto contenido con un formato de html. En versiones anteriores esto era posible, y era responsabilidad del programador la validación de dichas etiquetas para evitar que un usuario introdujera código malicioso a nuestra aplicación.

Con ASP.net 4.0 ahora  la validación es de manera automática. Si un usuario intenta agregar etiquetas de html una aplicación web, el resultado es una excepción. Esta validación automática puede ser desactivada mediante una sencilla instrucción del archivo de web.config.

Lo primero que hay que hacer es dentro de Visual Studio 2010 vamos a crear una nueva aplicación web. Agregamos una forma web nueva y vamos a crear controles básicos que permitan capturar etiquetas de html y un botón que provoque un postback de nuestra página.


<asp:TextBoxID="txtComments"runat="server"Rows="4"TextMode="MultiLine"ClientIDMode="Static"Width="400px"></asp:TextBox>

      <asp:Button ID="btnInsertScript"runat="server"Text="Insert
Inline"
onclick="btnInsertScript_Click"/>


En el codeBehind de nuestra página podemos comprobar que el html en realidad se capture y se pinte de manera correcta


htmlCode = HttpUtility.HtmlEncode(txtComments.Text);

          
Response.Write(this.txtComments.Text);

Al correr la aplicación y capturar un html dentro de ese textbox, y debido a que aún cambiamos el modo de validación dentro del web config, obtenemos la siguiente excepción.



Es importante mencionar que esta excepción ocurre dentro del HttpRequest, es decir, aun cuando nuestro código esté preparado para el manejo de excepciones con un try catch, este error ocurre antes de ejecutar cualquier código de nuestra página, incluso el Load. Si se quiere manipular esta excepción de manera personalizada, debe hacerse dentro del Archivo Global.asax.cs en el método Application_Error

voidApplication_Error(object sender, EventArgs e)

      
{

          
// Code that runs when an unhandled error occurs

           Response.Redirect("ErrorPage.htm");


}



Este manejo de excepciones controlará cualquier excepción que no sea correctamente manipulada correctamente en la aplicación.

Si queremos que esta validación automática sea deshabilitada para permitir el ingreso de html dentro de nuestro textbox, es necesario agregar la siguiente etiqueta dentro del nodo<system.web> en el archivo Web.config:



<httpRuntime requestValidationMode="2.0" />


Esto deshabilitará la validación y permitirá la captura de html :


 Nota importante: Esta es una manera de permitir que el usuario ingrese etiquetas de html dentro de nuestra aplicación. Sin embargo, nunca debe confiarse en cualquier texto capturado por un usuario, pues puede contener código malicioso que pueda provocar fallas en nuestra aplicación. Lo más conveniente es que cuando se va a devolver  un texto capturado hacia la interfaz de usuario, siempre utilizar el método HtmlEncode:

HttpUtility.HtmlEncode(txtComments.Text);

De esta manera todos las etiquetas de html serán rendereados completamente en la pantalla y no interpretados por el navegador.
Si se desea desplegar el html que el usuario ingresa, es mejor utilizar controles de Edición específicos para ello, o bien controlar de manera adecuada el código en el cual se inyectara dicho HTML.

martes, 8 de junio de 2010

Temas Dinámicos en Silverlight 3.0

Cuando creamos una aplicación Silverlight es común que queramos aplicar diferentes Temas a nuestra aplicación para que los colores y efectos sean personalizables. El Silverlight Toolkit de CodePlex nos permite hacer esto de manera sencilla. Para este ejemplo requieres los siguientes prerrequisitos.

·  Silverlight 3.0.

·  Silverlight Toolkit. Puedes descargarlo de este enlace http://silverlight.codeplex.com/Wikipage

·  Visual Studio 2008.

·  Expression Blend 3.0. Esta herramienta no se require realmente, pero se recomienda utilizar Blend cuando se va a realizar algún diseño de Interfaz de usuario, es más sencillo y más rápido que en Visual estudio para dichas actividades.

Primero que nada es necesario crear una aplicación Silverlight con su respectivo Website.



A continuación, hay que agregar algunos controles a los que se les desea aplicar el tema. Para este ejemplo se agregan algunos TextBox , algunos TextBlocks y un botón. A continuación se muestra el Xaml creado.




La linea más importante es:




Con esta linea estamos indicando al plugin de Silverlight que usaremos la dll Theming.dll que forma parte del Silverlight Toolkit. Esto no funciona si no se agregan las referencias correspondientes, así que hay que agregar la referencia a la dll System.Windows.Controls.Theming.Toolkit.dll.

Para ello, es necesario buscarla en el path C:\Program Files\Microsoft SDKs\Silverlight\v3.0\Toolkit\Nov09\Themes\Xaml (Toma en cuenta tu versión de SO por si el path pudiera cambiar). Este es el path de instalación por defecto del Silverlight Toolkit en Windows 7 a 32 bits. Luego hay que copiar 2 archivos de Tema (o más si así lo decides) al directorio raíz de la aplicación. Personalmente copié los siguientes:

·  System.Windows.Controls.Theming.BubbleCreme.xaml

·  System.Windows.Controls.Theming.BureauBlue.xaml

Ahora es necesario utilizar el siguiente código para hacer el cambio de temas:

private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
{

// TODO: Add event handler implementation here.


Uri uri = new Uri(@"SLTheming;component/System.Windows.Controls.Theming.BureauBlue.xaml",
UriKind.Relative);


ImplicitStyleManager.SetResourceDictionaryUri(LayoutRoot, uri);


ImplicitStyleManager.SetApplyMode(LayoutRoot, ImplicitStylesApplyMode.Auto);


ImplicitStyleManager.Apply(LayoutRoot);



}



private void Button_Click(object sender, System.Windows.RoutedEventArgs e)

{


Uri uri = new Uri(@"SLTheming;component/System.Windows.Controls.Theming.BubbleCreme.xaml", UriKind.Relative);

ImplicitStyleManager.SetResourceDictionaryUri(LayoutRoot, uri);


ImplicitStyleManager.SetApplyMode(LayoutRoot, ImplicitStylesApplyMode.Auto);

ImplicitStyleManager.Apply(LayoutRoot);


}


Con éste código, solo hay que iniciar la aplicación con el Website correspondiente y presionar el botón para revisar
cómo el Website cambia de esta apariencia:




A esta:




jueves, 20 de mayo de 2010

Compartiendo información entre Aplicaciones Silverlight

Dentro de una solución dentro de cuya arquitectura se utilicen aplicaciones Silverlight, puede ser bastante útil el pasar información de un .XAP a otro a manera de estado, o como parámetros o banderas para ejecutar tal o cual acción. Esta funcionalidad se logra con Isolated Storage.

Isolated Storage funciona de manera similar a las cookies dentro de un cliente que explora una página web, es decir, crea archivos dentro de la máquina cliente que accede a la aplicación, y puede utilizarse para guardar el estado de una aplicación o bien, para pasar grandes cantidades de información, siempre y cuando el cliente permita crear archivos de gran dimensión. Estos son los principales puntos sobre el manejo de Isolated storage:

• La forma en que Silverlight 2 maneja Isolated Storage es a través de archivos que se guardan en la máquina del cliente de acuerdo a su sistema operativo.
Las ubicaciones son las siguientes:



Sistema Operativo


Ubicación Física


Windows Vista


<SYSTEMDRIVE>\Users\<user>\AppData\LocalLow\Microsoft\Silverlight\is


Windows XP


<SYSTEMDRIVE>\Documents and Settings\<user>\Local Settings\Application Data\Microsoft\Silverlight\is


MAC OS


/Users/<user>/Library/Application Support/Microsoft/Silverlight/is




• El Isolated Storage se basa en la identidad del usuario y de la aplicación, o bien de la identidad del usuario y la identidad de la aplicación.

• Cada aplicación puede guardar su propio Isolated Storage, el cual es visible solo para esa aplicación mientras se esté ejecutando (o mientras no lo eliminen de la ruta física).

• Todas las aplicaciones de un mismo sitio tienen un Isolated Storage común, el cual es visible para todas las aplicaciones del mismo sitio. La forma de grabar a este Storage es mediante el siguiente código:



using (var store = IsolatedStorageFile.GetUserStoreForSite())

using (var stream = store.CreateFile("sharedhello.txt"))

using (var writer = new StreamWriter(stream)) {

writer.Write ("Hello Shared World");

}

• La forma de leer de este Storage desde otra
aplicación es la siguiente:



using (var store = IsolatedStorageFile.GetUserStoreForSite())
{

if (store.FileExists("sharedhello.txt"))
{

using (var stream = store.OpenFile("sharedhello.txt",
FileMode.Open))

using (var reader = new StreamReader(stream)) {

string contents = reader.ReadToEnd(); // "Hello


Shared World"

}

}

}

• El Isolated Storage es
medido en Quotas, que para silverlight representa la cantidad de espacio físico disponible para este almacenaje. Por default el espacio del Quota es de 1MB.

• Es posible solicitar más espacio físico al usuario si así se requiere, pero el código debe dispararse desde un evento disparado por el usuario (un click de botón) y debe esperar la autorización del usuario.
Esto es que una vez que se ejecuta el código, la aplicación pide permiso al
usuario para incrementar su espacio disponible de almacenaje.
Esto se hacemediante las siguientes instrucciones:



using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{

// 5 MB of isolated storage space is needed

int spaceNeeded = 1024 *
1024 * 5;



if (store.AvailableFreeSpace < spaceNeeded)
{

if (store.IncreaseQuotaTo(store.Quota
+ spaceNeeded))

{

// The user accepted the request

}

}

}