Mostrando entradas con la etiqueta tips. Mostrar todas las entradas
Mostrando entradas con la etiqueta tips. Mostrar todas las entradas

martes, 18 de septiembre de 2012

Utilizar un número indeterminado de parámetros en C#

Tal y como hace el método Format de la clase String hoy he necesitado hacer una función que utilice un número indeterminado, bueno en realidad tres o 4, de parámetros, pero no me apetecía crear 3, 4 o 5 métodos  iguales con llamadas de unos a otros. La solución es bien simple y para eso usaremos una característica que nos da C#. Para demostrar su funcionamiento haremos una función que sumará un número indeterminado de número de enteros
public int Suma(params int[] values)
{
 int suma = 0;
 for (int i = 0; i < values.Length; i++)
  suma += values[i];
 return suma;
}
Bastante fácil, ¿verdad?

Happy coding!

domingo, 13 de mayo de 2012

jQuery desactivar el menú contextual del navegador

Para desactivar el menú contextual (típicamente el menú que sale a hacer click con el botón derecho sobre la página cargada) tan solo deberemos añadir el siguiente código a nuestra página
$(document).ready(function(){
    $(document).bind("contextmenu", function(e){
        return false;
    });
});
Si lo quisiéramos poner en todas las páginas de nuestra aplicación web tan solo debemos poner el código anterior en nuestra MasterPage (ASP.NET) o Layout Page (ASP.NET MVC).

Happy coding!

domingo, 6 de mayo de 2012

jQuery maxlength en un textbox multilinea (textarea)

Si alguna vez hemos usado en asp.net los textbox multilinea nos habremos dado cuenta que la propiedad maxlength no funciona.
<asp:TextBox ID="TextBoxMultiLine" MaxLength="1" TextMode="MultiLine" runat="server"></asp:TextBox>
Que en html quedaría
<textarea name="ctl00$MainContent$TextBoxMultiLine" rows="2" cols="20" id="MainContent_TextBoxMultiLine"></textarea>
Para hacer que funcione podemos usar el siguiente código en jQuery
$(document).ready(function () {
  $('[id$=_TextBoxMultiLine]').keypress(function (e) {
    if ($(this).val().length + 1 > 1)
      e.preventDefault();
  });
});
El motivo de usar en el selector de jQuery el identificador _TextBoxMultiLine, es por la forma que tiene ASP.NET de asegurarse que un identificador sea único en la página. Si usamos ASP.NET 4.0 podemos hacer uso del modificador ClientIDMode y asignarlo con Static para evitar que el ID cambie. En se caso el script quedaría de la siguiente
<asp:TextBox ID="TextBoxMultiLine" MaxLength="1" TextMode="MultiLine" ClientIDMode="Static" runat="server"></asp:TextBox>
$(document).ready(function () {
  $('#TextBoxMultiLine').keypress(function (e) {
    if ($(this).val().length + 1 > 1)
      e.preventDefault();
  });
});
Otra posibilidad es no poner usar el atributo ClientIDMode y usar el ClientID de la siguiente manera
$(document).ready(function () {
  $('#<%= TextBoxMultiLine.ClientID %>').keypress(function (e) {
    if ($(this).val().length + 1 > 1)
      e.preventDefault();
  });
});
Si no queremos usar jQuery, podríamos llamar al un método en el evento keyUp. Para eso añadimos esto en el Page_Load de nuestra página
TextBoxMultiLine.Attributes.Add("onKeyUp", "Count(this, 1)");
function Count(text, long) {
  var maxlength = new Number(long);
  if (text.value.length > maxlength) 
    text.value = text.value.substring(0, maxlength);  
}

Happy coding!

sábado, 5 de mayo de 2012

jQuery input text numérico

Aquí les dejo un pequeño trozo de código para hacer que un input de tipo text solo admita caracteres numéricos ([0-9])
$('input').keydown(function(e) {  
  // Admite [0-9], BACKSPACE y TAB
  if ((e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105) && e.keyCode != 8 && e.keyCode != 9)
      e.preventDefault();
});
Pueden probar el código aquí ( http://jsfiddle.net/z2aEL/ )

Happy coding!

jueves, 5 de abril de 2012

Unificando los métodos de hash MD5 y SHA256 en C#

Si analizamos las clases MD5CryptoServiceProvider y SHA256CryptoServiceProvider vemos que estas heredan de MD5 y SHA256 respectivamente, pero tanto la clase MD5 como SHA265 heredan de la clase HashAlgorithm. Con esto nos sería bastante fácil unificar nuestras rutinas de encriptación de la siguiente manera
public string Encrypt(string input, HashAlgorithm hashAlgorithm)
{
  byte[] inputBytes = Encoding.UTF8.GetBytes(input);
  byte[] hashedBytes = hashAlgorithm.ComputeHash(inputBytes);

  StringBuilder output = new StringBuilder();

  for (int i = 0; i < hashedBytes.Length; i++)
    output.Append(hashedBytes[i].ToString("x2").ToLower());

return output.ToString();
}

public string MD5Encrypt(string input)
{
  return Encrypt(input, new MD5CryptoServiceProvider());
}

public string SHA256Encrypt(string input)
{
  return Encrypt(input, new SHA256CryptoServiceProvider());
}
No debemos olvidarnos el importar el espacio de nombres System.Security.Cryptography.
using System.Security.Cryptography;
Happy coding!

martes, 3 de abril de 2012

Como obtener el hash SHA256 en C#

Según la wikipedia, la familia SHA (Secure Hash Algorithm, Algoritmo de Hash Seguro) es un sistema de funciones hash criptográficas relacionadas de la Agencia de Seguridad Nacional de los Estados Unidos y publicadas por el National Institute of Standards and Technology (NIST). El primer miembro de la familia fue publicado en 1993 es oficialmente llamado SHA. Sin embargo, hoy día, no oficialmente se le llama SHA-0 para evitar confusiones con sus sucesores. Dos años más tarde el primer sucesor de SHA fue publicado con el nombre de SHA-1. Existen cuatro variantes más que se han publicado desde entonces cuyas diferencias se basan en un diseño algo modificado y rangos de salida incrementados: SHA-224, SHA-256, SHA-384, y SHA-512 (llamándose SHA-2 a todos ellos).

Al igual que con MD5, .NET nos ofrece la posibilidad de obtener el valor SHA256 de una manera muy sencilla. Tan sólo debemos usar el siguiente código
public string SHA256Encrypt(string input)
{
  SHA256CryptoServiceProvider provider = new SHA256CryptoServiceProvider();

  byte[] inputBytes = Encoding.UTF8.GetBytes(input);
  byte[] hashedBytes = provider.ComputeHash(inputBytes);

  StringBuilder output = new StringBuilder();

  for (int i = 0; i < hashedBytes.Length; i++)
    output.Append(hashedBytes[i].ToString("x2").ToLower());

  return output.ToString();
}
También hay que tener en cuenta que debemos importar el espacio de nombres System.Security.Cryptography.
using System.Security.Cryptography;

Algunos ejemplos
SHA256('') = 4574890e042bd574ae8d75562fe5bca34e7e5b518d9bbe2a7d5b39d1f6ed63c1
SHA256('SHA256') = b3abe5d8c69b38733ad57ea75e83bcae42bbbbac75e3a5445862ed2f8a2cd677

Nota: En este algoritmo he usado la clase StringBuilder para concatenar el resultado. En el caso del algoritmo MD5 este cambio refleja una mejoría de unos 100ms en caso que calculemos el hash 250.000 veces. Este mejoría es despreciable en caso que queramos calcular el hash para un solo registro. En caso del algoritmo SHA256 casi no presenta una mejoría ya que el porcentaje de tiempo concatenando la cadena es realmente despreciable comparado con el tiempo que lleva el calculo del hash.

Happy coding!

miércoles, 28 de marzo de 2012

Como obtener el hash MD5 en C#

Según la wikipedia MD5 (abreviatura de Message-Digest Algorithm 5) es un algoritmo de reducción criptográfico de 128 bits ampliamente usado. Su uso es muy variado y lo podemos encontrar en:
  • Los resúmenes MD5 se utilizan extensamente en el mundo del software para proporcionar la seguridad de que un archivo descargado de Internet no se ha alterado. Comparando una suma MD5 publicada con la suma de comprobación del archivo descargado, un usuario puede tener la confianza suficiente de que el archivo es igual que el publicado por los desarrolladores.
  • En sistemas UNIX y GNU/Linux se utiliza el algoritmo MD5 para calcular el hash de las claves de los usuarios. En el disco se guarda el resultado del MD5 de la clave que se introduce al dar de alta un usuario, y cuando éste quiere entrar en el sistema se compara el hash MD5 de la clave introducida con el hash que hay guardado en el disco duro. Si coinciden, es la misma clave y el usuario será autenticado.
  • El MD5 también se puede usar para comprobar que los correos electrónicos no han sido alterados usando claves públicas y privadas.
Pues bien, como no podía ser de otra manera, .NET nos ofrece la posibilidad de obtener el valor MD5 de una manera muy sencilla. Tan sólo debemos usar el siguiente código

public static string MD5Encrypt(string value)
{
  MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
 
  byte[] data = System.Text.Encoding.ASCII.GetBytes(value);
  data = provider.ComputeHash(data);
 
  string md5 = string.Empty;
 
  for (int i = 0; i < data.Length; i++)
    md5 += data[i].ToString("x2").ToLower();
 
  return md5;
}

También hay que tener en cuenta que debemos importar el espacio de nombres System.Security.Cryptography.
using System.Security.Cryptography;

Algunos ejemplos
MD5('') = d41d8cd98f00b204e9800998ecf8427e
MD5('MD5') = 7f138a09169b250e9dcb378140907378
Happy coding!

jueves, 22 de marzo de 2012

Depurando las consultas SQL generadas por Entity Framework

Muchas veces, sobre todo en consultas complejas Entity Framework puede no devolvernos los datos que esperábamos. Normalmente cuando esto ocurre suelo recurrir al SQL Server Profiler, pero no siempre lo tengo disponible ya que es una funcionalidad que no está presente en la versión Express del SQL Server. Pero como siempre, los chicos de Microsoft han pensado en todo y hay una forma bastante simple de obtener la consulta que ha generado el Entity Framework para poder jugar con ella y ver donde está el fallo.
using (FooEntities entities = new FooEntities())
{
 var result = (from p in entities.Bar
   where p.IdBar.Equals(1001)
   select p);

 System.Diagnostics.Trace.Write(string.Format("SQL: {0}", ((System.Data.Objects.ObjectQuery)result).ToTraceString()));    
}
Esto nos devolverá en nuestra ventana de Resultados lo siguiente
SQL: SELECT 
[Extent1].[IdBar] AS [IdBar], 
[Extent1].[BarDesc] AS [BarDesc], 
[Extent1].[Valor] AS [Valor], 
[Extent1].[FC] AS [FC], 
[Extent1].[UC] AS [UC]
FROM [dbo].[Bar] AS [Extent1]
WHERE 1001 = [Extent1].[IdBar]
Algo bastante simple que nos puede ayudar bastante en algún momento.

Happy coding!

martes, 3 de enero de 2012

Como mostrar una imagen con ASP.NET MVC3

Supongamos que queremos cargar una imagen que se encuentra en nuestro sistema de fichero de manera dinámica. Bien, en nuestro cshtml debemos poner el siguiente código

<img src="@Url.Action("showimage", "rest", new { id = 1 })" alt="" />

Y en nuestra controladora deberemos declarar la siguiente acción

public ActionResult showimage(int id) 
{
    var path = Server.MapPath("~/content/image");
    var file = string.format("{0}.png", id);
    var fullPath = Path.Combine(path, file);
    return File(fullPath, "image/png", file);
}

Happy coding!