Eu estava dando uma lida no código do ASP.Net MVC (baixei a solução do Codeplex, Preview 4) para entender melhor o que acontece quando você cria algo assim:
<% =Html.Textbox(“nome”) %>
Na prática, eu já sabia que ele buscava alguma propriedade no modelo que chamasse “nome”. Por exemplo, se é uma classe de produto e tenho uma variável p uma chamada em código de p.nome, retornaria o valor. Com Mvc, é assim que se faz. Mas é só isso mesmo? Intrigado, fui pesquisar.
Descobri que tudo se passa em uma classe interna chamada ViewDataEvaluator. Essa classe fica dentro da classe ViewDataDictionary (veja o código agora no Codeplex), que é a coleção de dados que aparece na propriedade ViewData da ViewPage. Essa classe ViewDataEvaluator tem um método chamado Eval, que recebe uma string de nome “expression”, e retorna um objeto. Fiquei intrigado com os comentários logo no começo da classe:
//Given an expression "foo.bar.baz" we look up the following (pseudocode): // this["foo.bar.baz.quux"] // this["foo.bar.baz"]["quux"] // this["foo.bar"]["baz.quux] // this["foo.bar"]["baz"]["quux"] // this["foo"]["bar.baz.quux"] // this["foo"]["bar.baz"]["quux"] // this["foo"]["bar"]["baz.quux"] // this["foo"]["bar"]["baz"]["quux"]
Esses comentários indicava que, além de buscar propriedades simples, esse esse tal de ViewDataEvaluator faz algumas coisas a mais. Descobri que, além de uma propriedade do modelo, ele retorna também indexadores (ou propriedades default).
Isso quer dizer que se eu tiver uma propriedade “Item”, que possui uma coleção de chaves/valores, posso chamar “nome”, e o Mvc vai procurar nessa coleção.
Além disso, também significa que, dada uma classe de produto, que possui uma propriedade chamada “Categoria”, que aponta para um objeto de categoria, e tendo este objeto uma propriedade Nome, posso chamar assim:
<% =Html.Textbox(“Categoria.nome”) %>
Também vai funcionar.
E se tivesse, na categoria, uma propriedade indexadora, poderia chamar assim:
<% =Html.Textbox(“Categoria.nome.chave”) %>
E o valor da chave ia ser retornado.
Realmente é muito inteligente.
Além disso tudo, ficou claro que além do modelo, tudo isso funciona também com a coleção ViewData. Se, por exemplo, eu colocar na coleção Viewdata um produto:
ViewData[“p”] = produto;
Consigo obter os dados da categoria assim:
<% =Html.Textbox(“p.Categoria.nome”) %>
Gostei bastante do que vi. Para melhorar mais, só se eles integrassem, por exemplo, com a coleção de Request.Form. Se fizessem isso, algumas coisas iam ficar mais fáceis. Em um post, eu poderia devolver uma view, que reconhecesse sozinha os valores do post da anterior, sem me preocupar se ele vem de Request.Form, ou da ViewData, por exemplo.
O framework MVC, além de ser muito bom, inspira bastante na leitura do código fonte. Sugiro, a quem tiver interesse, dar uma olhada.
Giovanni Bassi
Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.