Temple Coding

  • Home
  • Open Source
  • Sobre
    • Livros que estou lendo
    • Sobre
RSS

Templates no Asp.Net MVC2

Posted on 02/03/2010 by vintem
2 CommentsLeave a comment

Uma das grandes novidades do Asp.Net MVC2 são os templates. Quem já fez algum projeto usando o Dynamic Data do WebForms vai ver que essa funcionalidade é bem parecida com a do Dynamic Data.

O framework agora é capaz de exibir um dado em um formato específico de acordo com o tipo de dados (integer, decimal, boolean, ou mesmo uma classe).

Como isso funciona? A forma mais simples é utililando o método Html.DisplayForModel. Vejamos, dado a classe de modelo:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Cliente
{
    public string Nome { get; set; }
    public string Email { get; set; }
    public bool Ativo { get; set; }
    public DateTime DataNascimento { get; set; }
    public decimal Credito { get; set; }
 
    public static Cliente Criar()
    {
        return new Cliente {
            Nome = "Thiago Temple",
            Email = "eu@vintem.com.br",
            Ativo = true,
            Credito = 1000,
            DataNascimento = new DateTime(1981, 10, 15)
        };
    }
}

Uma view dessa forma:

E um controller:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ClienteController : Controller
{
    public ViewResult Index()
    {
        return View(Cliente.Criar());
    }
 
    public ViewResult Edit()
    {
        return View(Cliente.Criar());
    }
 
    [HttpPost]
    public ViewResult Edit(Cliente cliente)
    {
        if (ModelState.IsValid)
            return View("Index", cliente);
        return View(cliente);
    }
}

Então ao chamarmos a Action Index do nosso controller veremos:

Veja que os nomes das propriedades aparecem nos labels e os campos já estão formatados como o booleano, data e decimal.

Para a action Edit, temos um método similar Html.EditForModel

Que vai exibir um visualização assim:

Simples não? Mas e se eu quiser exibir “Data de Nascimento” ao invés de DataNascimento no label? Basta decorar a propriedade com o atributo DisplayName do namespace System.ComponentModel assim:

?View Code CSHARP
1
2
3
4
5
6
7
8
9
public class Cliente
{
    public string Nome { get; set; }
    public string Email { get; set; }
    public bool Ativo { get; set; }
    [DisplayName("Data de Nascimento")]
    public DateTime DataNascimento { get; set; }
    public decimal Credito { get; set; }
}

Existem alguns atributos disponíveis para customizar o modelo, são eles:

  • [HiddenInput] (System.Web.Mvc) – usando esse atributo será gerado um campo hidden no modo Edit
  • [DataType] (System.ComponentModel.DataAnnotations) – Define o tipo de dados da propriedade
  • [ReadOnly] (System.ComponentModel) – Deixará a propriedade como ReadOnly
  • [DisplayFormat] (System.ComponentModel.DataAnnotations) – Definir a propriedade NullDisplayText exibe um texto para quando o valor for nulo.  Informar a propriedade DataFormatString define em qual formato o texto deverá ser exibido. Informar a propriedade ApplyFormatInEditMode como true irá usar o formato também no modo Edit. Informar a propriedade ConvertEmptyStringToNull irá converter uma string vazia para  nulo.
  • [DisplayName] (System.ComponentModel) – Define o nome da propriedade

Exibindo campos específicos

Se for o caso de exibir ou editar apenas alguns campos do modelo, pode-se utililzar os métodos Html.DisplayFor(model => model.Propriedade) e Html.EditFor(model => model.Propriedade).

Conclusão

É muito simples gerar uma visualização a partir dos assistentes do visual studio, mas isso irá gerar um código estático. Se você quiser uma forma mais prática com base nas propriedades do modelo basta usar os novos métodos. Existe também uma forma de customizar a exibição das propriedades. Vou mostrar isso num próximo post.

Tweet
government,politics news,politics news,politics
Categories: Sem categoria
Notice: This work is licensed under a BY-NC-SA. Permalink: Templates no Asp.Net MVC2
Porque eu abandonei as stored procedures
Validação com Asp.Net MVC2 parte 3 – Input vs Model validation
  • Bruno

    Muito bom! O bacana é que, qualquer alteração no Model já reflete aonde você o utiliza. Ou seja, aquela síndrome de “ah, coloca mais um campinho aqui” funcionaria.

    Uma pergunta, supondo que a minha aplicação seja um produto, e eu tenha um model com propriedades comuns, há alguma forma de eu herdar o estender esse model com propriedades específicas de uma instalação para um cliente em particular? E neste caso, quais alterações eu precisaria fazer na View para que ela assumisse estas novas propriedades?

    • VinTem

      Usando um framework de Dependency Injection como o structuremap, por exemplo, isso pode ser feito somente configurando um arquivo xml apenas, desde de que as classes implementem uma mesma interface obviamente.
      É claro que internamente, se fosse salvar na base de dados teria que haver um tratamento específico para cada caso.

  • Categorias

    • .NET (1)
    • ASP.NET (1)
    • ASPNET MVC (15)
    • Blog (1)
    • Controle de Versões (2)
    • Desenvolvimento (10)
    • Java (1)
    • JavaScript (2)
    • jQuery (1)
    • Leitura (5)
    • Ruby (2)
    • Ruby on Rails (1)
    • Sem categoria (23)
    • Testes (4)
  • Language

    • English
    • Português
  • Tags

    agilidade asp.net asp.net mvc asp.net vc automapper blog code templates controle de versoes css dataaccess dependency injection ebook encoding eventos excecoes firebug git globalizacao hibernate iis ironruby jasypt java javascript jquery json leitura less mvccontrib qcon rails ruby selenium simpledata snippet stored procedures structuremap tdc templates testes testes integrados visualstudio vraptor windsor
© Temple Coding. Proudly Powered by WordPress | Nest Theme by YChong