Desenvolvimento - ASP. NET

ASP.NET MVC Custom Helpers

Pode-se notar que há um gasto desnecessário em codificação na escrita de URLs por exemplo. O ASP.NET MVC permite que customizemos os os membros da classe Html e Url, facilitando o uso dos mesmos nas Views. Neste artigo vamos explorar esta liberdade que o ASP.NET MVC nos fornece.

por André Baltieri



Introdução

Nos artigos anteriores, pode-se notar que há um gasto desnecessário em codificação na escrita de URLs por exemplo. O ASP.NET MVC permite que customizemos os os membros da classe Html e Url, facilitando o uso dos mesmos nas Views.

Em alguns casos, podemos customizar até mesmo componentes, como foi o caso do DropDownList Helper que sobrescrevi, e pode ser encontrado neste link: http://andrebaltieri.insidedotnet.com.br/andre_baltieri/post/ASPNET-MVC-DropDownList-Helper.aspx. Deste modo, temos um DropDownList que trabalha facilmente com Enumeradores.

Neste artigo vamos explorar esta liberdade que o ASP.NET MVC nos fornece.

HTML Helpers

Os HTML Helpers fornecem acesso a controles HTML através de Tags do ASP.NET, como por exemplo <%= Html.TextBox("nome") %>. Os HTML Helpers disponíveis por padrão são:

  • Html.ActionLink()
  • Html.BeginForm()
  • Html.CheckBox()
  • Html.DropDownList()
  • Html.EndForm()
  • Html.Hidden()
  • Html.ListBox()
  • Html.Password()
  • Html.RadioButton()
  • Html.TextArea()
  • Html.TextBox()

Estas tags devem ser utilizadas entre as tags <% using (Html.BeginForm()) { %> e <% } %>, que identificam a região de um formulário na página.

Por fim, quando renderizada, esta tag utilizando o HTML Helper teremos o input clássico do HTML <input id="nome" name="nome" type="text" value="" />.

Um detalhe interessante nesta parte é que temos que utilizar o caractere "=" para que o TextBox seja renderizado (<%= Html.TextBox("nome") %>). Quando não utilizamos nenhum caractere após inicial a tag <%, significa que não haverá nada para ser renderizado na tela.

Criando HTML Helpers

Basicamente existem duas formas de se criar Helpers customizados, e elas são através de Static Methods e Extension Methods.

Para este exemplo, criei uma nova pasta na raiz da minha aplicação MVC chamada de Helpers, e em seguida adicionei uma nova classe, chamada LabelHelper.

Nos Static Methods, o que devemos fazer é retornar uma string com o código do controle HTML. Neste caso, retornaremos uma Label, como mostrado na Listagem 1.

 
using System;
 
namespace MvcCustomHtmlHelper.Helpers
{
    public class LabelHelper
    {
        public static string Label(string target, string text)
        {
            return String.Format("{1}", target, text);
        }
    }
}

Listagem 1 - Static Method para criação de Labels.

Deste modo, podemos importar o namespace no qual nosso helper está criado e utilizá-lo normalmente em nossas Views, como mostrado na Figura 1.

Figura 1 - Utilizando o LabelHelper criado.
Figura 1 - Utilizando o LabelHelper criado.

Na outra mão, temos os Extension Methods, onde extendemos o próprio Html Helper, e então adicionamos funcionalidades ao membro Html.

Deste modo, temos um código similar, mas não estamos criando um novo Helper, e sim extendendo ele. A Listagem 2 ilustra o código dessa classe.

 
public static class LabelExtensions
{
    public static string Label(this HtmlHelper helper, string target, string text)
    {
        return String.Format("{1}", target, text);
    }
}

Listagem 2 - Extension Method para criação de Labels.

Note que apenas o construtor mudou na classe, porém, na hora de utilizar este na View, teremos a seguinte situação.

Figura 2 - Utilizando o LabelHelper criado (Extension Method).
Figura 2 - Utilizando o LabelHelper criado (Extension Method).

Note que quando os membros aparecem, o Label consta, e deixando o mouse sobre o mesmo, temos a indicação que este é uma extensão (Extension).

Criando URL Helpers

Até o momento, vimos como criar helpers para controles HTML, porém, outra coisa que podemos fazer é criar helpers para URL.

Há um tempo Kazi Manzur Rashid publicou (E vem mantendo atualizado) um post sobre melhores práticas com ASP.NET MVC. Dentre as várias melhores práticas estão presente a criação de Extension Methods para gerar roteamento de URLs no ASP.NET MVC e também mapear arquivos js e css.

Para ver todas as melhores práticas acesse o endereço: http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx

UrlHelper Extension Methods

O UrlHelper permite a criação de links para ações de controllers mais fácilmente. Ele também permite que as rotas sejam testadas, já que temos métodos para isto.

A Listagem 3 mostra a criação de extension methods para Url.

 
public static class UrlHelperExtension
{
    public static string Home(this UrlHelper helper)
    {
        return helper.Content("~/");
    }
 
    public static string Products(this UrlHelper helper)
    {
        return helper.Content("Product");
    }
 
    public static string Browse(this UrlHelper helper, string category)
    {
        return helper.Content("Product/Browse/" + category);
    }
}

Listagem 3 - Extension Method para Rotas de URL.

No primeiro e segundo método, retornamos a rota padrão (Default Route) e o controller Product, respectivamente.

No terceiro método, retornamos um caminho completo, junto a categoria dos produtos. No final, teremos uma string como "Products/Browse/Foods" por exemplo.

Nota: O ideal no terceiro método seria utilizar o método RouteUrl, porém como Custom Routes não é o objetivo deste artigo, simplesmente utilizamos o método Content.

Por fim, a Figura 3 ilustra a utilização destes métodos na View.

Figura 3 - Utilizando o UrlHelper criado (Extension Method).
Figura 3 - Utilizando o UrlHelper criado (Extension Method).

File Helper

Vamos então criar helpers para arquivos, como por exemplo arquivos javascript, imagens e CSS.

A idéia aqui é a mesma dos Url helpers, facilitar possíveis testes e facilitar a utilização de arquivos na View. Novamente, teremos métodos simples utilizando o helper.Content, retornano um string.

A Listagem 4 ilustra a criação de helpers para arquivos.

 
public static class FileHelper
{
    public static string Image(this UrlHelper helper, string fileName)
    {
        return helper.Content("~/Content/Images/" + fileName);
    }
 
    public static string Stylesheet(this UrlHelper helper, string fileName)
    {
        return helper.Content("~/Content/" + fileName);
    }
 
    public static string NoImage(this UrlHelper helper)
    {
        return Image(helper, "noimage.jpg");
    }
}

Listagem 4 - Extension Method para arquivos.

No primeiro método, criamos um helper para inclusão de imagens na View, e através do helper.Content retornaremos uma string com o caminho da imagem.

No método seguinte, da mesma forma, criamos um helper para inclusão de arquivos CSS na View e por fim, criamos um método que não requer nenhuma infomação e tem a função de exibir uma imagem padrão "No Image" (Sem imagem), para os casos onde o usuário ainda não tem uma imagem definida, por exemplo.

As Figuras 4 e 5 mostram a utilização destes helpers na View.

Figura 4 - Utilizando o helper de arquivos.
Figura 4 - Utilizando o helper de arquivos.

Figura 4 - Utilizando o helper de arquivos.
Figura 5 - Utilizando o helper de arquivos.

Conclusão

Podemos ver o qual flexivel o ASP.NET MVC é perante a extensão de suas classes. Vimos também que os helpers facilitam a utilização de controles comuns na View, ajudam na diminuição de erros e podem ser testados.

Importante ressaltar também que existem boas práticas sobre o framework, e elas deve ser seguidas.

Até o próximo artigo.

André Baltieri

André Baltieri - Trabalha com desenvolvimento de aplicações web a mais de 7 anos, e com ASP.NET desde 2003. É líder da comunidade Inside .NET (http://www.insidedotnet.com.br/) e do projeto Learn MVC .NET (http://learn-mvc.net/). Bacharelando em Sistemas de Informação, atualmente trabalha com desenvolvimento e suporte de aplicações web em ASP.NET/C# em projetos internacionais e ministra treinamentos e consultorias sobre a plataforma .NET.