[ASP.NET MVC] Encapsulando lógica con Helpers

Posted on Actualizado enn


Hola a todos, hoy quiero compartirles un pequeño post de cómo es posible encapsular lógica que usamos en las vistas en MVC utilizando Helpers, no tocare el detalle de cómo utilizar Helpers, ya que algunos amigos has escrito excelentes artículos al respecto (Refrito de helpers en ASP.NET MVC), sin embargo hoy aportare un poco a tan buenos artículos.

Bueno, iniciemos con un modelo bastante simple:

public class Client
{
	public int ClientId { get; set; }

	public string Name { get; set; }

	public int State { get; set; }
}

Luego un controlador con la acción Home y allí retornamos un pequeño listado de clientes:

public class HomeController : Controller
{
	private readonly List<Client> clients = new List<Client>()
	{
		new Client { ClientId = 1, Name = "Julio", State = 0},
		new Client { ClientId = 2, Name = "Julio", State = 1}
	};

	public ActionResult Index()
	{
		return View(clients);
	}
}

y finalmente la vista:

@model IEnumerable<HelpersIf.Models.Client>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.State)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.State)
        </td>
        <td>
            @if (item.State == 0)
            {
                <b style="color:red;">Disable</b>
            }
            else if (item.State == 1)
            { 
                <b style="color:green;">Enable</b>
            }
        </td>
    </tr>
}

</table>

Revisando el código de la vista, se utiliza una sentencia if para validar el estado del cliente y mostrar si esta activo o no dependiendo del valor de la propiedad State, aunque en este caso solo tenemos dos posibles estados, en una aplicación real se pueden tener bastantes opciones, y en mi opinión se estaría contaminando demasiado la vista con lógica de aplicación (entre otros puntos que no me gustan del todo). Para solucionar el problema anterior, es posible crear un Helper que encapsule dicha lógica y deje permita dejar la vista mucho más limpia, así que el siguiente código realizará tal función:

public static class ClientHelper
{
	public static HtmlString ClientState(this HtmlHelper helper, Client client)
	{
		string state = string.Empty;

		if (client.State == 0)
		{
			state = "<b style='color:red;'>Disable</b>";
		}
		else if (client.State == 1)
		{
			state = "<b style='color:green;'>Enable</b>";
		}

		return new HtmlString(state);
	}
}

Una vez que tenemos listo el Helper, vamos a la vista y allí realizamos dos pequeños cambios, el primero es hacer using del namespace donde esta el Helper y el segundo es utilizarlo, por lo tanto luego del cambio la vista quedaría:

@model IEnumerable<HelpersIf.Models.Client>
@using HelpersIf.Helpers

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.State)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.State)
        </td>
        <td>
            @Html.ClientState(item)
        </td>
    </tr>
}

</table>

Espero el post les sea de interés, nos vemos!

Descarga el ejemplo!

7 comentarios sobre “[ASP.NET MVC] Encapsulando lógica con Helpers

    Fernando Serapio (@fherxosc) escribió:
    09/23/2013 en 10:53

    sube tus ejemplos a github asi nos seria mas facil chismear tu codigo😉

      Julio Avellaneda respondido:
      09/23/2013 en 21:25

      Gracias Fernando, lo voy a tener en cuenta para los próximos post🙂

      Saludos.

    waltermontes escribió:
    09/23/2013 en 23:17

    Muy buen post, directo al punto y conciso. Va rebloggeado.
    ¡Saludos!

    […] [ASP.NET MVC] Encapsulando lógica con Helpers. […]

    […] [ASP.NET MVC] Encapsulando lógica con Helpers […]

    Pablo escribió:
    04/08/2014 en 23:16

    y el helper en que carpeta lo ubicas?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s