[Eventazo] Megathon Windows 8 ¿Te lo vas a perder?

Bueno, este post es para lo que dice el titulo anunciar un eventazo que va a tener lugar los días 7,8 y 9 de Septiembre en varias ciudades españolas:

– Barcelona

– Bilbao

– Canarias

– Cordoba

– Coruña

– Logroño

– Madrid

– Santander

– Sevilla.

Como veis no hay escusa para no asistir =p.

El evento va a consistir en desarrollo de aplicaciones para el nuevo sistema operativo Windows 8.

Bueno  no me enrollo mas, teneis toda la información relativa al evento en Megathon Win8

¿Te lo vas a perder?

Saludos!

PD: Añadidas Murcia y Palma gracias @DarioDBA

[VS2012] Información del llamante

Introducción:

Lo primero que poco me gustan algunas traducciones, así que vamos a llamar las cosas por su nombre, en este post vamos a hablar de una de las novedades de .NET 4.5 “Caller Information”.

Una de las cosas novedosas de esta nueva versión del Framework viene a facilitarnos la vida a la hora de realizar trace y log de errores de nuestras aplicaciones (aunque en este post vamos a ver otra utilidad de esta información).

Dentro del espacio de nombres “System.Runtime.CompilationServices” se han agregado tres atributos que van a poder ser aplicados sobre parámetros de un método:

– CallerFilePath: Va a cualificar un parámetro que almacenará el nombre del fichero que ha provocado la llamada.

– CallerLineNumber: Va a cualificar un parámetro que indicará la línea donde se encontraba la llamada al método.

– CallerMemberName: Va a cualificar un parámetro que indicará el nombre del método que contenía la llamada.

 

La aplicación de estos atributos, se realizará sobre parametros opcionales, los cuales tendrán que ser inicializados con algun valor:

 

public static  void Log([CallerFilePath]string path="",[CallerLineNumber]int line=0,[CallerMemberName] string method="")
{
//Do Actions
}

Podríamos invocar a este método desde cualquier parte de la aplicación y tendríamos la información indicada.

Os dejo un ejemplo de una aplicación de consola para que veais el funcionamiento.

Un ejemplo:

Un sitio donde puede ser interesante de utilizar es en la implementación del patrón MVVM (que tanto trabajo va a tener de cara al futuro).

Podríamos aplicarlo al definir un ViewModelBase donde se realice la implementación del evento PropertyChanged:

   1:  public class VMBase : INotifyPropertyChanged
   2:     {
   3:         public event PropertyChangedEventHandler PropertyChanged;
   4:         public void ChangeProperty([CallerMemberName]string property = "")
   5:         {
   6:             if (PropertyChanged != null)
   7:                 PropertyChanged(this, new PropertyChangedEventArgs(property));
   8:             MessageBox.Show(property);
   9:         }
  10:     }

Espero que os sea de utilidad.

Saludos!!!

[Tip] Extendiendo TypeConverter para tratar con nulos

Introducción

En este mini post voy a definir un método extensor al tipo TypeConverter para el tratamiento de valores nulos provenientes de la BD.

Al Lio

Como todos sabeis ( y sino muy mal…) un nulo proveniente de la Base de Datos va a ser DbNull.Value (no es el mismo null que en c#), bien para evitar problemas con el uso de TypeConverter, vamos a definir la siguiente extensión:

 

 

 public static class TypeConverterExtensions

    {

        public static object ConvertToWithNullableValues(this TypeConverter converter, object value, Type propertyTipe)

        {

            if ((value == null || value == DBNull.Value))

                return null;

           if (value.GetType().Equals(propertyType)) return value;

            return converter.ConvertTo(value, propertyTipe);



        }

    }

Un ejemplo de su utilización sería:

reg.GetType().GetProperty(prop.Name).SetValue(reg, converter.ConvertToWithNullableValues(reader[prop.Name], prop.PropertyType), null);

En el ejemplo estoy usando Reflection porque accedo dinamicamente a las propiedades…

Bueno espero que os sea de utilidad.

 

 

Saludos!

PD: He añadido una condición más para que si los tipos del objeto y el tipo a convertir coincidan no intente hacer una conversión.

[MVC] Editando Colleciones con un Template

Introduccion

El otro día el Gran Eduard (@Eiximenis) me resolvió una duda que tenia acerca del modelBinder y el potente enlace de datos que presenta ASP.NET MVC.

Ha raíz de este post y del comentario de “ar7uro”, en el que planteaba la posibilidad de evitar las llamadas al servidor para ir agregando elementos a la colección.

Como resolverlo

Podríamos definir una variable javascript donde escribiéramos todo el código o hacerlo a través de la obtención del Html de la vista. Yo me he decantado por esta segunda versión.

Así que partiendo del ejemplo de Eduard, vamos a realizar algunos cambios:

– Dentro de la vista parcial:

   1:  @model MvcApplication5.Models.Direccion
   2:   
   3:  <div class="editor-label">
   4:      @Html.LabelFor(model => model.Calle)
   5:  </div>
   6:  <div class="editor-field">
   7:      @Html.Editor(string.Format("{0}[{1}].{2}", "Direcciones", "xxx", "Calle"))
   8:      @Html.ValidationMessage(string.Format("{0}[{1}].{2}","Direcciones", "xxx", "Calle"))
   9:   
  10:  </div>
  11:  <div class="editor-label">
  12:      @Html.LabelFor(model => model.Numero)
  13:  </div>
  14:  <div class="editor-field">
  15:      @Html.Editor(string.Format("{0}[{1}].{2}", "Direcciones", "xxx", "Numero"))
  16:      @Html.ValidationMessage(string.Format("{0}[{1}].{2}", "Direcciones", "xxx", "Numero"))
  17:  </div>

Hemos eliminado el Prefix y el número que se le va a asignar.

– Dentro de la vista de Cliente:

He modificado el código javascript, para realizar una primera llamada para obtener el html, y para que en el click del botón incremente el contador de Direcciones, y reemplace ‘xxx’ por dicho valor.

   1:  <script type="text/javascript">
   2:      var idx = 0;
   3:      var direccionTemplate = "";
   4:      $(document).ready(function () {
   5:          alert('hola');
   6:          $.get('@Html.Raw(Url.Action("CreateDir","Direcciones"))', function (data) {
   7:              direccionTemplate = data;
   8:          });
   9:   
  10:          $('#cmdNewDir').click(function () {
  11:              var newTemplate = direccionTemplate.replace(/xxx/g,idx.toString());
  12:              idx++;
  13:              $('#direcciones').append(newTemplate);
  14:          });
  15:   
  16:   
  17:      });
  18:  </script>

 

Espero que os sea de utilidad!!!