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 clients = new List() { 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 @{ ViewBag.Title = "Index"; }

Index

     @foreach (var item in Model) {      }
@Html.DisplayNameFor(model => model.Name)  @Html.DisplayNameFor(model => model.State) 
@Html.DisplayFor(modelItem => item.Name)  @Html.DisplayFor(modelItem => item.State)  @if (item.State 0) { Disable } else if (item.State 1) { Enable } 

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 = "Disable"; } else if (client.State 1) { state = "Enable"; } 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 @using HelpersIf.Helpers @{ ViewBag.Title = "Index"; }

Index

     @foreach (var item in Model) {      }
@Html.DisplayNameFor(model => model.Name)  @Html.DisplayNameFor(model => model.State) 
@Html.DisplayFor(modelItem => item.Name)  @Html.DisplayFor(modelItem => item.State)  @Html.ClientState(item) 

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

Descarga el ejemplo!