Inauguracion Nuevo Blog

Buenas a todos.

 

La verdad es que tengo el blog bastante abandanado por falta de tiempo pero me he planteado volver a escribir y retomar «Buenos habitos» XD.

 

He creado un Nuevo blog en http://jtorrecilla.net/blog aunque eso no significa que deje de escribir aqui (intentare repartir los post)

La tema del primer articulo que saldra del horno mas tarde es Copia de datos entre Bases de datos.

 

Salu2!

Obtener la información de un fichero WSDL en c#

Introducción

Actualmente estoy trabajando en un proyecto en el que necesitamos obtener la información a un servicio web.

Dentro del framework podemos encontrarnos con la clase ServiceDescription, el cual nos va a permitir analizar el contenido de un fichero WSDL.

En este post os voy a exponer una pequeña clase que he creado para devolver información que puede seros de utilidad:

Al turrón!

   1: internal static class WebServiceConfigurationReader

   2:     {

   3:         internal static WebServiceInfo Read(string webServiceUrl)

   4:         {

   5:             if (string.IsNullOrWhiteSpace(webServiceUrl)) throw new Exception("WebServiceUrl parameter required.");

   6:             var uri = GetUriFromString(webServiceUrl);

   7:             var request = CreateWebRequest(uri);

   8:             var serviceDescription = GetServiceDescription(request);

   9:             return serviceDescription != null ? ParseServiceDescription(serviceDescription) : null;

  10:         }

  11:  

  12:         internal static Uri GetUriFromString(string webServiceUrl)

  13:         {

  14:             UriBuilder uriBuilder = new UriBuilder(webServiceUrl);

  15:             uriBuilder.Query = "Wsdl";

  16:             return uriBuilder.Uri;

  17:         }

  18:  

  19:         internal static HttpWebRequest CreateWebRequest(Uri uri)

  20:         {

  21:             var webRequest = (HttpWebRequest)WebRequest.Create(uri);

  22:             webRequest.ContentType = "text/xml;charset="utf-8"";

  23:             webRequest.Method = "GET";

  24:             webRequest.Accept = "text/xml";

  25:             return webRequest;

  26:  

  27:         }

  28:  

  29:         internal static ServiceDescription GetServiceDescription(HttpWebRequest request)

  30:         {

  31:             using (var response = request.GetResponse())

  32:             {

  33:                 using (var stream = response.GetResponseStream())

  34:                 {

  35:                     return stream != null ? ServiceDescription.Read(stream) : null;

  36:                 }

  37:             }

  38:         }

  39:  

  40:         internal static WebServiceInfo ParseServiceDescription(ServiceDescription serviceDescription)

  41:         {

  42:             var webServiceInfo = new WebServiceInfo();

  43:             webServiceInfo.TargetNamespace = serviceDescription.TargetNamespace;

  44:             webServiceInfo.Methods = GetWebServiceMethods(serviceDescription);

  45:             return webServiceInfo;

  46:         }

  47:  

  48:         internal static List<WebServiceMethod> GetWebServiceMethods(ServiceDescription serviceDescription)

  49:         {

  50:             var webSerivceMethodList = new List<WebServiceMethod>();

  51:             foreach (PortType portType in serviceDescription.PortTypes)

  52:             {

  53:  

  54:                 foreach (Operation operation in portType.Operations)

  55:                 {

  56:                     var method = new WebServiceMethod();

  57:                     method.Name = operation.Name;

  58:                     method.InputParameters = GetWebMethodParameters(serviceDescription, operation.Name);

  59:                     method.OutputParameters = GetWebMethodParameters(serviceDescription, operation.Name + "Response");

  60:                     Console.Out.WriteLine();

  61:                     webSerivceMethodList.Add(method);

  62:  

  63:                 }

  64:             }

  65:             return webSerivceMethodList;

  66:         }

  67:  

  68:         internal static List<WebServiceMethodParameter> GetWebMethodParameters(ServiceDescription serviceDescription, string messagePartName)

  69:         {

  70:             List<WebServiceMethodParameter> parameters = new List<WebServiceMethodParameter>();

  71:  

  72:             Types types = serviceDescription.Types;

  73:             System.Xml.Schema.XmlSchema xmlSchema = types.Schemas[0];

  74:  

  75:             foreach (object item in xmlSchema.Items)

  76:             {

  77:                 System.Xml.Schema.XmlSchemaElement schemaElement = item as System.Xml.Schema.XmlSchemaElement;

  78:                 if (schemaElement != null)

  79:                 {

  80:                     if (schemaElement.Name == messagePartName)

  81:                     {

  82:                         System.Xml.Schema.XmlSchemaType schemaType = schemaElement.SchemaType;

  83:                         System.Xml.Schema.XmlSchemaComplexType complexType = schemaType as System.Xml.Schema.XmlSchemaComplexType;

  84:                         if (complexType != null)

  85:                         {

  86:                             System.Xml.Schema.XmlSchemaParticle particle = complexType.Particle;

  87:                             System.Xml.Schema.XmlSchemaSequence sequence = particle as System.Xml.Schema.XmlSchemaSequence;

  88:                             if (sequence != null)

  89:                             {

  90:                                 foreach (System.Xml.Schema.XmlSchemaElement childElement in sequence.Items)

  91:                                 {

  92:                                     string parameterName = childElement.Name;

  93:                                     string parameterType = childElement.SchemaTypeName.Name;

  94:                                     parameters.Add(new WebServiceMethodParameter(parameterName, parameterType));

  95:                                 }

  96:                             }

  97:                         }

  98:                     }

  99:                 }

 100:             }

 101:             return parameters;

 102:         }

 103:     }

 

Un ejemplo de funcionamiento sería:

No os he expuesto todo el código, como por ejemplo las clases que retorno, pero son bastante sencillas.

PD: Se aceptan comentarios 😉

Mostrando un valor de moneda con formato en base a su cultura.

Introducción

Hace bastante tiempo que no escribo ya que he estado bastante liado, y entre otras cosas me he cambiado de PAIS…

Mi gran amigo Pedro monto un buen debate con auténticos cracks como Edu Tomas, Jose Maria Aguilar, Marc Rubiño y mas gente, sobre la «internacionalización» de enumerados dentro de MVC, es decir, que si tu aplicación es multiidioma tu enumerado debería poder estar localizado en los distintos idiomas que admita tu aplicación, ¿o no?

Bueno, en mi nueva aventura por tierras de William Wallace, estoy trabajando en una aplicación MVC localizada en distintos idiomas, hasta aqui todo bien (sin entrar en el tema de enumerados, que lo dejare para otro da…) entre en un debate con un compañero de trabajo acerca de la visualización de monedas dentro de la aplicación.

El debate surgió, debido a que a la hora de registrar un coste tu vas a indicar la moneda en la que va dicho coste, independientemente de la “cultura” en la que está establecida la aplicación para el usuario que esta registrando el coste, ¿cómo se debe mostrar luego dicha cantidad?. Por ejemplo:

var cost= 50.15;
 
cost.ToString("c", new CultureInfo("en-US"))

Si yo quiero introducir 50 USD, si el formato que vamos a utilizar es el que viene con la cultura en-US, debería ser “$ 50”.

Solución

Bien, ya que hemos dicho que tenemos almacenado el valor de la moneda y el importe podemos hacer uso de:

Para el proyecto que estoy trabajando ahora mismo que es un proyecto MVC, la solución mas interesante sería definir un método Extensor como el siguiente:

public static string CurrencyWithCulture(this HtmlHelper helper, decimal data, string locale = «en-US»)
        {
var culture = new System.Globalization.CultureInfo(locale);
return data.ToString(«C», culture);
        }

Y poder utilizarlo en nuestras vistas a través de @Html.CurrencyWithCulture(Model.Cost,”es-ES”)

Saludos!

[Trick] ¿Cómo utilizar los Helpers de MVC dentro de nuestros js?

Intro

Una más que recomendada practica a la hora de hacer nuestros desarrollos es separar el código js de nuestra View a un fichero aparte. La problemática viene en el momento que queremos utilizar uno de los helpers de MVC (I y II) ya que javascript no va a ser capaz de realizar la interpretación de lo queremos realizar.

Ejemplo (fichero js):

 var contentCssUrl= '@Url.Content("~/Content/Site.css")';
    alert(contentCssUrl);

Al mostrar el alert veremos exactamente lo que contiene entre comillas y no es el resultado que deseamos.

Solución

Para solventar este problema, será necesario que incorporemos un poco de código javascript a nuestra vista:

<script type="text/javascript">
    var contentCssUrl = '@Url.Content("~/Content/Site.css")';
</script>

Una vez agregado este fragmento en nuestra View, podremos utilizar a nuestro gusto la variable en nuestro fichero js ya que el motor Razor se habrá encargado de analizar el uso del helper y asignárselo a nuestra variable.

[OffTopic] Resumen 2013

Este es el ultimo post del año en el blog y quiero aprovecharlo para hacer un pequeño resumen de lo que ha sido el 2013.

Para mi ha sido un año realmente duro y complicado personalmente lo que ha generado que haya estado menos activo de lo habitual en redes sociales y sobre todo en el blog a la hora de publicar artículos de contenido técnico para compartir con todos aquellos que soléis acompañarme o que llegáis al blog en busca de alguna cosa de lo que publico.

En el terreno profesional también ha sido un año “raro”, ya que acabe el 2012 en una empresa donde hice grandes amigos (@mrcalderon3d @delahermosa @vlad @jadgoo @enadan @charlydms @mery @ruidosnet @eugenio y muchos mas…), tuve la ocasión de fichar por una empresa como es Pasiona allá por Mayo, donde estoy rodeado de auténticos cracks también, y que me ha brindado un proyecto que ha sacado grandes cosas de mi y que también ha reducido mi tiempo de  investigar ciertas cosas que antes tenia mas tiempo.

Debido a estos “cambios” ha sido un año un poco flojo para mi en la comunidad, pero he tenido la enorme suerte de volver a ser nombrado MVP en la categoría de C# (gracias @crisgherrero).

Con el 2014 ya, a falta de muy poquito, me he propuesto varias cosas:

– Sacarme unas certificaciones en el primer trimestre del año relativas al desarrollo web y alguna mas… (Lengua fuera)

– Retomar con fuerza el blog y los artículos que he publicado en otros sitios como www.desarrolloweb.com, con cosas como Angular.js, Mobile Services, nuevas características de C#, etc.

– Volver a dar mas charlas y participar en grandes eventos, ya que nos enriquecemos todos.

 

Ya solo me queda deciros, que espero que estéis disfrutando de estas fiestas con vuestros seres queridos y que en el año 2014 se cumplan todos vuestros deseos.

 

[KENDO + Jquery UI] Reordenando filas de un grid realizado con Kendo

Introducción

Llevo un tiempo en un proyecto web en el que estamos utilizando los controles Kendo realizados por Telerik para hacer una experiencia de usuario un poco mejor.

A pesar de los muchos problemas que nos hemos encontrado (Gonzalo y Alex os incluyo) para adaptarlos a las verdaderas necesidades del cliente, bajo mi punto de vista están quedando bastante bien-

Anteriormente a la utilización de los controles de Kendo, pese a que la decisión de usar Kendo era desde casi el inicio del proyecto, se decidió usar como control GRID SlickGrid en una versión anterior a la actual y que, también bajo mi criterio, contaba con características inferiores a Kendo GRID.

En una de las vistas donde teníamos un SlickGrid implementado que permitía al usuario final la reordenación de las filas haciendo “Drag and Drop”. El cliente ya había visto está funcionalidad, y para está ultima vista todavía éramos reacios a cambiar Slick por Kendo, pero finalmente me lance a la piscina.

Bien, ya entrados en “historia”, vamos al lio, vamos a ver como implementar “Drag and Drop” en Kendo Grid, ya que no viene implementado en la API de Kendo (al menos de momento), y para ello vamos a utilizar Jquery UI Sortable.

Al turron!

Para utilizar sortable dentro de KendoGrid será necesario que utilicemos el selector correcto para elegir las filas de la tabla:

$('#myGridName table tbody').sortable({
            connectWith: "#myGridName table tbody"
        });

Como podéis ver es realmente sencillo, y te da la potencia de usar Jquery Sortable y de los eventos que posee por si necesitas realizar alguna acción más.

 

Espero que os sea de utilidad.

[WEB] El curioso caso de en mi maquina funciona

¡En mi maquina funciona, y en otros tantos clientes también!

Ayer fue un día donde durante unas 4 horas largas casi 5 estuve ayudando a resolver una incidencia en la instalación de una aplicación web MVC4 que usa SQL SERVER 2008 R2 como motor de BD, que usa autenticación basada en formularios, etc., vaya algo bastante “común”.

Recibí un correo a primera hora de la mañana de un cliente que estaba teniendo problemas a la hora de realizar el login dentro de la aplicación. Él metía los datos de un usuario correcto, y al realizar la redirección a la página de inicio de la aplicación, nos encontrábamos un maravilloso:

image

Debido a distancia con el cliente, y a que no podían instalar ninguna herramienta para realizar escritorio remoto empezamos a realizar comprobaciones a través de skype:

– La conexión  con la BD era correcta, ya que un usuario erróneo, no llegaba a una pagina autorizada…

– Volvimos a registrar ASP.NET con el comand aspnet_regiis –i sin exito

– En el event viewer del servidor aparecía un problema que decía: Exception message: Server cannot set status after HTTP headers have been sent. Podeis ver mas info de este error en este post de SO. Yo tenía claro que no era un error en el código, debido a que la instalación con la misma guía de instalación se había realizado en diversos clientes ya, y yo ayer mismo, lo instale en mi IIS local, y en un equipo “limpio” sin tener este problema.

Después de ir revisando alternativas encontradas por internet no dábamos con la tecla con lo que en mi IIS local empecé a revisar la configuración de la aplicación, hasta que llegue a :

 

image

Le indique al cliente que fuera a la opción Autenticación de nuestra aplicación, y la opción de Autenticación mediante formularios estaba deshabilitada!!!!! En el instante en el que habilito dicha opción nuestra aplicación funciono.

 

Lo curioso de esto, es que por defecto está habitualmente se encuentra habilitada.

 

Espero que si os encontráis está situación podáis resolverlo con está solución!

 

Saludos!

[Básico][MVC]Los Helpers en MVC

Llevo bastante tiempo “desaparecido” del blog por motivos de un proyecto que me tiene bastante atareado.

En este artículo quiero hablaros del uso de los helpers existentes dentro de MVC, en que consisten, como y cuando utilizarlos.

¿Qué es un Helper de MVC?

Como indica la palabra Helper, es algo que nos va a ayudar a definir una porción de código html dentro de las vistas que queremos utilizar en nuestra aplicación MVC.

Cuando estamos escribiendo el código de nuestras vistas y pulsamos “@” aparece el intellisenses de Visual Studio indicando los métodos disponibles. Dentro de todos los métodos existentes, vamos a definir tres grandes grupos: Html, Url y Ajax.

HTML Helpers

La clase HtmlHelper nos va a permitir generar código html en tiempo de ejecución para definir controles web como: etiquetas, cajas de texto, combos, checkbox…, vamos a encontrar helpers que nos permitan definir un formulario y la acción que se va a ejecutar en el momento de pulsar submit, o nos va a permitir por ejemplo definir enlaces.

El uso de está clase te va a facilitar la escritura del código de tu vista, evitando incluso cometer errores.

¿Cómo se utiliza?

Su eso es realmente sencillo, como comentaba anteriormente al pulsar @ sale el intellisense, y al teclear “Html.” vamos a ver todos los métodos necesarios para realizar lo que necesitamos.

Dentro de esta clase vamos a encontrar helpers que nos van a ayudar a definir los formularios de nuestra vista indicando la acción que se realizará al hacer submit,

Para cada uno de los métodos vamos a encontrar 2 definiciones, por ejemplo: Html.TextBox y Html.TextBoxFor. La primera nos va a permitir generar nuestro elemento html, a través de las características que le definamos como atributos, el segundo además nos va a permitir establecer el valor de nuestro input enlazandolo al modelo o propiedad del modelo que estemos utilizando dentro de nuestra vista lo que además nos simplificará la tarea de envío de datos devueltos al servidor, ya que el dato ya estará en nuestro modelo. Ejemplos:

   1: @Html.TextBox("myTextBox1", "Ejemplo", new Dictionary<string, object> { { @"class", "textbox" }) 

   1: @Html.TextBoxFor(m=>m.MyProperty, new Dictionary<string, object> { { @"class", "textbox" }) 

¿Cómo definir un formulario?

   1: @using (Html.BeginForm("Update", "Client", FormMethod.Post}))

   2: {

   3:     

   4:     Html.TextBoxFor(m=>m.Name)

   5: }

 

Dentro de los helpers incluidos en esta clase podemos encontrar dos de bastante utilidad: RenderAction y RenderPartial. Los cuales nos van a permitir renderizar dentro de nuestra vista, otra vista o vista parcial.

RenderPartial: suele utilizarse cuando se comparten datos desde la vista que la define, por ejemplo: se quieren visualizar un conjunto de datos concretos del modelo.

RenderAction: Suele utilizarse cuando una vista es independiente de la otra y los datos que se muestran en esta segunda vienen directamente desde el controlador.

URL Helpers

La clase UrlHelper nos va a permitir generar urls para que las podamos utilizar dentro de nuestro aplicación.

El uso de esto nos va a evitar tener que escribir las urls del estilo “../../MiCarpeta/mipagina” o “~/Content/images/miimagen1.png”. Para ello disponemos de los siguientes métodos:

Url.Action: Nos va a devolver la ruta de una acción de un determinado controlador con los parametros que le indiquemos. Existen varias sobrecargas para dicha función por lo que se adapta a cualquiera de las opciones que necesitemos. De este módo podriamos utilizar:

   1: <a href=’@Url.Action(“Home”,”Home”)’>Ir a la Home</a>

Url.Content nos va a convertir una ruta relativa en una ruta absoluta, por lo que nos va a evitar escribir una url incorrecta. Ejemplo:

   1: <link rel="stylesheet" href='@Url.Content("~/Content/screen.css")' type="text/css"/>

 

AJAX Helpers

Dentro del apartado de Html Helpers hemos hablado BeginForm por ejemplo que nos permitia definir formularios para realizar la invocación a una determinada acción.

La clase AjaxHelper nos permite definir algunas características de nuestra vista pero ejecutándolas de forma asíncrona a través del uso de AJAX.

   1: @using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "MyHtmlElementId" }))

   2: {

   3:  

   4:     <input type="submit" value="OK" />

   5: }

Después de presionar el boton submit de nuestro formulario se invocará de forma asincrona la acción del controlador, y cuando acabe mostrara en el elemento html cuyo ID sea MyHtmlElementId el valor devuelto por la acción.

 

Conclusiones

La utilización de estos helpers incluidos dentro del framework MVC, viene a realizar una tarea de facilitación a la hora de generar el código HTML de nuestras vistas y minimizar posibles errores al generar ciertos elementos o rutas que necesitemos.

 

Espero que os sea de utilidad.

[MVC] Utilizar un Helper de MVC dentro de una función javascript

Actualmente me encuentro en un proyecto de MVC, en el que necesito construir un carrusel, donde los elementos que se van a mostrar en el carrusel, tienen que tener algunos componentes que normalmente generamos a través de los ya conocidos Helpers de MVC.

En este pequeño post os voy a poner un ejemplo de como he solucionado en este caso mi problematica:

   1: function CreateCarouselItem(item) 

   2:     {

   3:         var editor = '@(Ajax.JavaScriptStringEncode(Html.Label("t").ToHtmlString()))';

   4:       // Actions to configure the editor

   5:         return '<li><div>' + editor +   '</div></li>';

   6:     }

Aunque no lo muestro, estoy leyendo via Ajax un conjunto de datos que vienen en formato JSON, los itero, y en ese momento se realizaría la llamada a la función CreateCarouselItem.

Espero que os sea de utilidad.

Saludos!

[Libro] C# 5.0 Los fundamentos del lenguaje. Desarrollar con Visual Studio 2012

Gracias a Ediciones Eni he estado evaluando este libro que me facilitaron hace un tiempo.

El libro consta de los siguientes capitulos:

En este libro podemos ver como empezar a utilizar Visual Studio 2012 y como empezar a desarrollar aplicaciones “clásicas” de escritorio (Winforms).

Con él se pueden aprender algunas de las bases de C# y de su sintaxis, y se hace una buena introducción al uso de LINQ.

Recomendaría este libro para aquellas personas que estén aprendiendo a desarrollar con tecnología MS porque seguro que les será de utilidad.