Añadir Strong Name a DLL de terceros

.Net, General 1 Comentario »

Nos podemos encontrar en la situación, en el que al  añadir una librería de terceros a nuestro proyecto, al compilar, se produzca un error como este:

Unable to emit assembly: Referenced assembly ‘albloguera.utils’ does not have a strong name.

Esto es debido a que el assembly al cual estamos añadiendo esta DLL está firmado con un Strong Name. Los emsamblados firmados con Strong Name solo pueden hacer referencia a otras librerías firmadas con Strong Name.

Para solucionar el problemilla, vamos a usar la ventana de comandos de Visual Studio.

Visual Studio Tools

1. Crear el fichero de claves. No es necesario, ya que podemos usar el mismo que ya tenemos en nuestro Assembly.

  • sn -k albloguera.snk

2. Obtemos el MSIL (Microsoft Inmediate Language) del assembly.

  • ildasm albloguera.utils.dll /out:albloguera.utils.il

3. Generamos el nuevo Assembly, añadiendo el KeyFile al MSIL

  • ilasm albloguera.utils.il /dll /key= albloguera.snk

jQuery, UpdatePanel y Postbacks

.Net, jQuery Sin comentarios »

Esto de jQuery se esta convirtiendo en un vicio (compite mano a mano con Silverlight) y conforme más juegas más quieres y más te diviertes. Y si añadimos UpdatePanels, nos divertimos aún más si cabe.

Al usar jQuery, seguramente usaremos el evento Ready para añadir manejadores de eventos, añadir efectos, añadir / quitar clases.... en fin, inicializar los controles de nuestra página.  El evento Ready de jQuery  es un evento que se lanza una vez que todo el DOM de la página ha sido cargado por completo. Por otro lado tenemos los postback parciales provocados por los updatePanels. El cometido de estos controles es evitar la carga completa de la página, es decir, solo actualizar aquellos controles contenidos en el control UpdatePanel. Pero lo que hace realmente no es actualizar los valores de los controles, sino que los sustituye  por otros nuevos, tras lo cual todos los controles que hay en el UpdatePanel perderán las clases y eventos asociados a ellos en la inicialización de la página. Esto incluye tanto controles de servidor como controles de cliente, todos serán reemplazados.

Por ejemplo tomemos como ejemplo este UpdatePanel y controles:

HTML:
  1. <asp:UpdatePanel ID="UP" runat="server">
  2.         <ContentTemplate>
  3.             <table>
  4.                 <tr>
  5.                     <td width="40px">
  6.                         <span class="label8">Nombre: </span>
  7.                     </td>
  8.                     <td width="40px">
  9.                         <input type="text" id="txtnombre" class="inputText" />
  10.                     </td>
  11.                     <td width="80px">
  12.                         <asp:TextBox runat="server" ID="lblNombre"/>
  13.                     </td>
  14.                 </tr>
  15.                 <tr>
  16.                     <td>
  17.                         <span class="label8">Direccion: </span>
  18.                     </td>
  19.                     <td>
  20.                         <input type="text" id="txtDireccion" class="inputText" />
  21.                     </td>
  22.                     <td>
  23.                         <asp:TextBox runat="server" ID="lblDireccion"/>
  24.                     </td>
  25.                 </tr>
  26.                 <tr>
  27.                     <td>
  28.                         <asp:Button runat="server" ID="btnAceptar" Text="Aceptar"
  29.                             CssClass="btnMandatory" onclick="btnAceptar_Click"/>
  30.                     </td>
  31.                 </tr>
  32.             </table>
  33.         </ContentTemplate>
  34.    </asp:UpdatePanel>

 La inicialización de la página la llevaríamos a cabo normalmente así:

JavaScript:
  1.        $(document).ready(function () {
  2.             // Inicializacion de controles
  3.  
  4.        });

De esta manerá todo funciona correctamente, pero solo mientras no pulsemos el botón "Aceptar" que provoca el postpack parcial. Una vez hagamos click, todos los eventos asociados a los controles desaparecerán. Para solucionarlo tenemos que reasignarlos nuevamente, y una forma de hacerlo es añadiendo un manejador al evento que controla cuando un postback asíncrono ha finalizado. Nuestro código podría quedar así:

JavaScript:
  1. Sys.WebForms.PageRequestManager.getInstance().add_endRequest(Load);
  2.  
  3.         $(document).ready(function () {
  4.             Load();
  5.         });
  6.  
  7.         function Load() {
  8.             $('#' + '<%=btnAceptar.ClientID %>').attr('disabled', true);
  9.             $('#' + '<%=lblNombre.ClientID %>').attr('readonly', true);
  10.             $('#' + '<%=lblDireccion.ClientID %>').attr('readonly', true);
  11.  
  12.             $(".inputText").blur(function () {
  13.                 $(this).css("background-color", "FFFFFF");
  14.             });
  15.  
  16.             $(".inputText").focus(function () {
  17.                 $(this).css("background-color", "CCCCCC");
  18.             });
  19.  
  20.             $(".inputText").keyup(function () {
  21.  
  22.  
  23.                 if ($(this).val() == '')
  24.                     $('#' + '<%=btnAceptar.ClientID %>').attr('disabled', true);
  25.                 else {
  26.                     var nodata = false;
  27.                     $.each($(".inputText"), function () {
  28.                         if ($(this).val() == '')
  29.                             nodata = true;
  30.                     });
  31.                     $('#' + '<%=btnAceptar.ClientID %>').attr('disabled', nodata);
  32.                 }
  33.  
  34.             });
  35.  
  36.             $('#' + '<%=btnAceptar.ClientID %>').click(function () {
  37.                 $('#' + '<%=lblNombre.ClientID %>').attr('value', $("#txtnombre").val());
  38.                 $('#' + '<%=lblDireccion.ClientID %>').attr('value', $("#txtDireccion").val());               
  39.             });
  40.         } 

Lo que hemos hecho es envolver todo el código que teníamos en el evento Ready de jQuery en una función, y llamar a esta función tanto en el evento Ready, como cuando el postback asincrono del updatePanel ha terminado.

Una segunda opción sería Inyectar un script desde servidor que invoque a esta nueva función.

C#:
  1. protected void btnAceptar_Click(object sender, EventArgs e)
  2.  {
  3.         lblNombre.Text = lblNombre.Text + "--&gt; Validado con Exito";
  4.         lblDireccion.Text = lblDireccion.Text + "--&gt; Validado con Exito";
  5.         ScriptManager.RegisterStartupScript(this, GetType(), "", "Load();", true);
  6.  }

Mejorar rendimiento Pagina .Net. disminuyendo tiempos de carga

.Net Sin comentarios »

Seguramente que a más de uno le resultarán obvios los puntos mencionados en este post para mejorar el performance de una aplicación web .Net,  y reducir el peso de una página, pero nunca esta de mas recordarlos.El que escribe sin ir  más lejos los tuvo que aplicar no hace mucho tiempo cuando un cliente solicitó el análisis de una aplicación para intentar disminuir los tiempos de carga.

Imaginemos el siguiente escenario:

Un formulario con un elevado número de componentes, entre ellos muchos dropdownlist anidados en un DataList. Los dropdownlist son cargados en el servidor, y tenemos varios tipos de combos en cada fila diferenciados por los valores que contienen, y estos se repiten en cada una de las filas del DataList.

Pues si por ejemplo, tenemos 4 combos distintos por fila y el Datalist contiene 20 filas, quiere decir que enviamos 20 veces el contenido de cada tipo de combos desde el servidor al cliente (20x4=80 contenidos repetidos). Además tenemos elementos en el formulario, simplemente para mostrar información, sin nunguna funcionalidad asociada.

Bueno con un escenario asi de simple podemos aplicar los siguientes trucos:

  1. Sustituir aquellos elementos que no tienen funcionalidad asociada por etiquetas que son los elementos más ligeros capaces de mostrar información. De esta manera eliminamos una sobrecarga del ViewState.
  2. No cargar los DropDownList en el lado del servidor. En vez de establecer los valores desde .Net, inyectar codigo javascript que defina variables que contengan arrays bidimensionales con la tupla valor y texto que definan cada una de las opciones del combo. Luego, desde cliente, en el onLoad del formulario, cargamos cada unos de los combos con los valores de las variables.
  3. Eliminar los espacios en blanco que se crean al generar el HTML de la página. Para ello, desde la misma página, podemos sobrescribir el método Render que es justo el último punto desde donde podemos modificar el HTML  antes de enviarlo al cliente.

Ahora veamos un ejemplo de código que sobrescribe el método Render de una página.

C#:
  1. protected override void Render(HtmlTextWriter writer)
  2. {
  3.     HtmlTextWriter swHtmlText = new HtmlTextWriter(new System.IO.StringWriter());
  4.  
  5.     base.Render(swHtmlText);
  6.  
  7.     //Obtenemos el HTML de la pagina
  8.     string strHtml = swHtmlText.InnerWriter.ToString();
  9.  
  10.     //Eliminamos todos los espacios en blanco que hay
  11.     //entre los controles
  12.     strHtml = Regex.Replace(strHtml, "^\\s+<", " <", RegexOptions.Multiline);
  13.     strHtml = Regex.Replace(strHtml, ">\\s+<", "> <", RegexOptions.Multiline);
  14.  
  15.     //Escribimos el nuevo HTML limpio
  16.     writer.Write(strHtml.Trim());
  17.  
  18. }

Silverlight 2, Menu Contextual

.Net, Silverlight 4 Comentarios »

Llevaba tiempo esperando poder reescribir el control Menu Contextual que hice hace ya tiempo, ya que este dejó de funcionar en la sucesivas versiones alfas, betas y gammas de Silverlight (y no más versiones preliminares porque se le acabarían las letras a Microsoft, menuda pifia por su parte). Bueno el caso, es que no me apatecía volver a escribir el control hasta que Silverlight 2 no fuera una cosa seria. Parece ser que ahora si tenemos una versión final.

El código de este ejemplo lo puedes descargar aquí.

La lógica y funcionamiento del control sigue siendo la misma y practicamente no ha cambiado nada. Lo cambios mas importantes han sido la forma de aplicar propiedades sobre los objetos, y además que en esta nueva versión del Control MenuContextual , el userControl MenuContextaul estará formado por objetos OpcionMenu, siendo estos los encargados de pintarse y modificar su estado cuando el raton entre y salga de ellos. El control de los eventos delegados seguirá estando en el control padre MenuContextual.

Enlaces Relacionados:

Desabilitar Validador ASP.Net desde Javascript

.Net Sin comentarios »

Si alguna vez necesitamos desactivar un control 'Validator' desde Javascript, solo necesitamos conocer el nombre del validador en cliente, y llamar a la funcion ValidatorEnable de la siguiente forma:

JAVASCRIPT:
  1. function DesactivarValidador()
  2. {
  3. var control= document.getElementById('Validator.ClientID');
  4. ValidatorEnable(control, false);
  5. }

Comprobado desde la version 1.1 en adelante.

Estructura Proyecto Silverlight (1ª Parte)

.Net 3 Comentarios »

Que mejor forma de presentar la estructura de un proyecto en Silverlight que crear un pequeño proyecto de ejemplo. Nuestro ejemplo va a consistir en un control Silverlight que contendrá un gráfico de barras. La entrada de datos la haremos mediante tres campos de texto que serán controles normales HTML. Pero antes de nada veamos que ficheros obtenemos al crear un proyecto Silverlight.

Al instalar “Silverlight tools for Visual Studio 2008”, añadiremos a Visual Studio dos nuevos templates: Uno para gernerar un proyecto Silverlight y otro para crear controles Silverlight. Para nuestro ejemplo partiremos de un nuevo proyecto Silverlight. Despues de proporcionar un nombre al proyecto, se nos genera la estructura particular de un proyecto Silverlight.

Un proyecto Silverlight consta de ficheros XAML que definen las interfaces, ficheros CS que contienen el codebehind y ficheros HTML que sirven de entrada a las páginas. Como proyecto Silverlight, que contiene solo lógica de cliente, podremos ejecutarlo directamente desde nuestro navegador, es decir sin hacer uso del servidor web de visual studio (o IIS).

Leer el artículo completo »

Introduccion a Silverlight

.Net 3 Comentarios »

Silverlight LogoUna definición simplista, pero directa para describir a Silverlight, podría ser algo tal que así: “La nueva arma de Microsoft para combatir a Flash”, pero claro eso sería simplificar mucho. Simplificar mucho puede conllevar a errores, porque aunque al igual que Flash, Silverlight permite crear contenido interactivo que se ejecuta en cliente, mostrar animaciones y videos, Flash lleva muchos años de ventaja, está presente en la mayoría de los ordenadores, y es una tecnología madura y robusta.

Entonces, ¿Qué me ofrece Silverlight?, pues simplificando y en este caso si me vale, me ofrece la posibilidad de programar en cliente con tecnología .Net, es decir: Puedo programar en C# (o VB, según guste). Para ello Silverlight nos instalara en el navegador un plug-in al estilo de Flash que contiene en una versión reducida del CLR (common language runtime) de .Net.

Leer el artículo completo »

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in

Switch to our mobile site