La historia de mis desventuras

Palabras más, palabras menos sobre desarrollo de software.

Posts Tagged ‘ASP.NET MVC’

Breve Autocomplete Helper con ASP.NET MVC y jQuery

Posted by Jhonny López Ramírez en 16 marzo 2010

Han pasado ya varios días desde la última vez que escribí algo en el blog. Escaso tiempo. Vengo hoy con un pequeño Helper construido para hacer las veces de Autocomplete en ASP.NET MVC. Se trata de un ejemplo sencillo basado en un práctico jQuery Autocomplete (que pueden descargarse de aquí).

Una vez he descargado el paquete paso a descomprimirlo y a pegar los archivos claves en las rutas correspondientes, como muestro en la siguiente imagen:

2

Lo siguiente que haré será crear el HtmlHelper para automatizar el proceso de escritura de la función que hará la gracia. Para hacerlo tengo que disponer de una clase con los modificadores de acceso public y static y dentro un método de extensión a la clase HtmlHelper. Pongo aquí el código:

using System.Text;

using System.Web.Mvc;

 

namespace AutoCompleter.Helpers

{

    public static class MyHelpers

    {

        public static string AutoCompleter(this HtmlHelper helper, string name, string controller, string action, string fieldName, bool mustMatch)

        {

            StringBuilder html = new StringBuilder("<script type=\"text/javascript\">");

 

            html.Append("$(document).ready( function() {");

            html.AppendLine("$('#" + name + "').autocomplete('/" + controller + "/" + action + "/', {");

            html.AppendLine("dataType: 'json',");

            html.AppendLine("parse: function(data) {");

            html.AppendLine("var rows = new Array();");

            html.AppendLine("for(var i=0; i<data.length; i++){");

            html.AppendLine("rows[i] = { data:data[i], value:data[i]." + fieldName + ", result:data[i]." + fieldName + " };");

            html.AppendLine("} return rows;},");

            html.AppendLine("formatItem: function(row, i, n) {");

            html.AppendLine("return row." + fieldName + ";},");

            html.AppendLine(" width: 300, mustMatch: " + mustMatch.ToString().ToLower() + " , });});</script>");

 

            return html.ToString();

 

        }

    }

}

 

Lee el resto de esta entrada »

Posted in Desarrollo de software | Etiquetado: , | Leave a Comment »

Autorización configurable en ASP.NET MVC

Posted by Jhonny López Ramírez en 26 diciembre 2009

En esta entrada construiremos un prototipo de configuración de autorización para ASP.NET MVC. En el Web.config de la aplicación asociaremos las acciones del controlador con los roles que estarían autorizados. Para este caso tendremos una aplicación con tres roles: Administrator, Advanced, Limited.

Lo primero que crearemos será la sección de configuración que nos permitirá especificar la autorización a los distinos roles de la aplicación. Para ello, en el apartado <configsections> de nuestro web.config crearemos una sección de configuración:

<configSections>
 <section name="MyMvcAuthorization"
  type="System.Configuration.NameValueSectionHandler,System,Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</configSections>
A continuación y para simular el comportamiento de una aplicación crearemos un Controller, una clase de modelo y unos métodos de acción. A continuación cada uno:

El modelo

En la carpeta models de nuestro proyecto agregaré un archivo Model.cs y escribiré el siguiente código:

namespace MVCAuthorization
{    
     public class Person    
    {        
          public string Name { get; set; }
          public int Id { get; set; }    
     }
}

Como ven, se trata de un POCO bastante sencillo. Vamos con el controller:

El controller

Una clase controladora sencilla:

namespace MVCAuthorization.Controllers

{

    public class PersonsController : MyBaseController

    {

        List<Person> persons = new List<Person>();

        //

        // GET: /Persons/

        [Authorize()]

        public ActionResult Index()

        {



            Person firstPerson = new Person

            {

                Id = 1,

                Name = "Fulano de Tal"

            };


            Person secondPerson = new Person

            {

                Id = 2,

                Name = "Sutano de Tal"

            };


            persons.Add(firstPerson);

            persons.Add(secondPerson);


            return View();

        }


        //

        // GET: /Persons/Details/5

        [Authorize()]

        public ActionResult Details(int id)

        {

            Person person = persons

                .FirstOrDefault(it => it.Id == id);


            return View(person);

        }


        //

        // GET: /Persons/Create

        [Authorize()]

        public ActionResult Create()

        {

            return View();

        }


        //

        // POST: /Persons/Create


        [AcceptVerbs(HttpVerbs.Post)]

        public ActionResult Create(Person person)

        {

            try

            {

                // TODO: Add insert logic here

                persons.Add(person);

                return RedirectToAction("Index");

            }

            catch

            {

                return View();

            }

        }


        //

        // GET: /Persons/Edit/5

        [Authorize()]

        public ActionResult Edit(int id)

        {

            return View();

        }


        //

        // POST: /Persons/Edit/5


        [AcceptVerbs(HttpVerbs.Post)]

        public ActionResult Edit(int id, FormCollection collection)

        {

            try

            {

                // TODO: Add update logic here


                return RedirectToAction("Index");

            }

            catch

            {

                return View();

            }

        }

    }

}

De esta clase controladora quiero que notemos dos cosas interesantes: en primer lugar, que la clase hereda de MyBaseController. La implementación de esa clase base la pondré aquí más adelante, dado que es esta clase la que se encargará de verificar si una acción está autorizada a un usuario en un rol determinado. En segundo lugar, que cada método (puntualmente cada GET) está decorado con el atributo [Authorize()]. Esto obligará a los usuarios no autenticados a loguearse. Y obligará, también, a que la clase base, como lo veremos más adelante, verifique para dichos métodos la autorización.

Lo que se hará a continuación es establecer, de esta clase controladora, los permisos de los roles frente a los métodos de acción. Para ello volvemos al web.config y agregamos la sección MyMvcAuthorization, que hemos definido anteriormente y que es un Dictionary tradicional:

Lee el resto de esta entrada »

Posted in Desarrollo de software | Etiquetado: | 10 Comments »

¿ASP.NET MVC ó WebForms?

Posted by Jhonny López Ramírez en 10 noviembre 2009

Siguiendo con la línea editorial del artículo pasado me propongo en esta ocasión analizar las diferencias entre las dos opciones estelares de la plataforma .net para el desarrollo web: asp.net mvc y WebForms.

WebForms

Podríamos decir con respecto a WebForms que se trata de la simulación para la web de la visión de Rapid Application Development sostenida por Microsoft, puntualmente, de su visión del desarrollo de aplicaciones para sus sistemas operativos. Por tanto MS intentó minimizar el impacto y la curva de aprendizaje de los desarrolladores acostumbrados a trabajar en ambientes de escritorio mediante WebForms. Digamos que con WebForms se lograron cosas interesantes desde mi punto de vista y que supusieron una victoria (aunque ahora desde la luz del TDD y MVC parezcan derrotas), una de ellas, por ejemplo, el concepto de CodeBehind que permitía separar las etiquetas asp de la clase que las manejarían. Entonces ocurre con WebForms que manejo el desarrollo de mis páginas web orientado a eventos y se introducen dos conceptos importantes: el ViewState y el Postback, necesarios para que dicho modelo funcione. Todo eso que parecería una ventaja, para algunas situaciones empezó a convertirse en un problema y a medida que nuestros desarrollos crecían también el volumen de datos que debido al ViewState debía viajar en cada solicitud o respuesta hacia y desde el servidor se hacía considerable impactando el performance de la aplicación. Adicionalmente, en la medida en que iban ganando mercado otros navegadores la compatibilidad con los mismos se veía comprometida puesto que, reconozcámoslo, la emisión de html de los controles de servidor de WebForms no respeta cabalmente los estándares. Otro aspecto que debía considerarse es el hecho de que las urls creadas por este modelo de desarrollo estaban orientadas a archivos con extensiones por lo tanto la optimización para motores de búsqueda era precaria. Y un largo etcétera, como que se hacía prácticamente imposible el testeo de unidades de UI o que los desarrolladores se abstraían tanto de la implementación del HTTP que se acostumbraban a que la web tuviera estado, cuando lo natural es que no. En fin…

ASP.NET MVC

Y llega ASP.NET MVC. No voy a ahondar en el hecho de que es una implementación del Modelo-Vista-Controlador y lo que ello significa, no. Haré más bien un resumen de los puntos fuertes frente al modelo de desarrollo de WebForms. Empecemos por decir que se vuelve al concepto de la web sin estado por tanto las idas y vueltas al servidor son mucho más descongestionadas. Adicionalmente se reemplazan los eventos por acciones de controlador asociadas a los tradicionales verbos del HTTP (GET, POST, PUT, DELETE) y se logra una separación de conceptos que facilita el TDD. En la capa de la vista se usan plantillas Html lo que asegura en gran medida que se respetarán los estándares y se atenderán de manera óptima diversos navegadores, así como que se tenga mayor compatibilidad con Ajax como concepto. Otro aspecto importante es que las urls vuelven a estar basadas en recursos permitiendo optimizaciones para motores de búsqueda. Y otro largo etcétera que no es más que el hecho de volver a las bases del desarrollo web con un potente framework de fondo para la atención de tareas de propósito general. Como desventajas están el hecho de que los controles de UI vuelven a hacerse medianamente básicos y que el desarrollo se dilata un poco puesto que ya no se trata de arrastrar y soltar ni del tradicional desarrollo-orientado-a-clics de las herramientas MS. En ese sentido debemos ser justos y reconocer que los HtmlHelpers minimizarán ese impacto – tanto más cuando hay unos bastante interesantes en la primera versión del framework mvc – y que Visual Studio sigue siendo una herramienta sumamente potente en términos de minimizar los esfuerzos de desarrollo (aquí me permito hacer un reclamo y es el hecho de que la edición express de VWD actual no lo es tanto para asp.net mvc; espero que la edición 2010 sí lo sea).

Conclusiones

Lo anterior no significa que WebForms esté condenado a desaparecer, no. Ni mucho menos. MS ha sido claro en que seguirá brindando soporte, investigación y desarrollo a ambas opciones de manera paralela. A lo que se debe enfrentar el desarrollador actualmente es a la decisión de cuál usar en sus nuevos proyectos (o incluso si incorpora mvc a los anteriores puesto que pueden coexistir en el mismo proyecto). Yo basaría esa decisión en lo siguiente:

  • Si se trata de una aplicación corporativa (intranet o web) en la que la orientación a datos es fuerte (todas esas grillas de datos y sus facilidades) y los tiempos de respuesta no son el primer factor a tener en cuenta (hablábamos con Yeison García hace poco que en este tipo de aplicaciones los tiempos de respuesta no son un factor fundamental) yo recomiendo usar WebForms por varias cosas: el conjunto de controles UI y de componentes (bendito seas ObjectDataSource) es mucho más amplio, los tiempos de desarrollo se minimizan y los resultados pueden considerarse más estructurados.
  • Si se trata de una aplicación web en todo su esplendor de propósito general y orientada a atender usuarios de diverso calibre – lo que es la web 2.0 –, abiertas al público recomiendo ASP.NET MVC. También si se trata de proyectos basados en metodologías como agile en los que la orientación del desarrollo es al testeo recomiendo ASP.NET MVC.

Prácticamente el principal factor a tener en cuenta es si la aplicación está orientada a atender el público en general o es de carácter privado. Ya lo demás son concepciones del desarrollo web.

Posted in Desarrollo de software | Etiquetado: , , | 1 Comment »