none
Utilização de expressão lambda no HTML Helper TextBoxFor RRS feed

  • Pergunta

  • Saudações,

    imagino que minha dúvida seja de cunho básico, mas pesquisei e até o momento só encontro como utilizar e não uma explicação mais pormenorizada do funcionamento de expressões lambda na sintaxe do Razor (espero estar ao menos fazendo a pergunta de forma correta).

    Minha dúvida é a seguinte, ao usar o @Html.TextBoxFor (x=> x.ClienteId) numa view fortemente tipada, o intelisense detecta que o x é referente à classe que coloquei no início da view e que ClienteId é uma propriedade dela. Se eu troco o x por a funciona da mesma forma. Como não estou conseguindo entender muito bem como a expressão lambda funciona, imaginei que talvez fosse esse um caminho para fixar na cabeça sua sintaxe/funcionamento.

    O que fica parecendo (na minha visão de leigo) é que qualquer variável que eu criar ali (onde coloquei o x) ira referenciar à classe indicada no início do arquivo. É isso mesmo? Não atrapalharia caso eu quisesse usar na expressão lambda um parâmetro de outro tipo que não seja a classe (nesse caso a classe Cliente)?

    Abraço!

    terça-feira, 6 de outubro de 2015 23:19

Respostas

  • Vamos lá:

    Quando você usa a propriedade Html (@Html), você está usando uma instância da classe HtmlHelper<TModel> instanciada pelo MVC. Automaticamente, pelo genérico TModel, o HtmlHelper sabe que o Model, no seu caso, é a classe Cliente.

    Os métodos TextBoxFor, LabelFor, etc., são métodos de extensão da classe HtmlHelper. A assinatura deles é assim:

    public static MvcHtmlString TextBoxFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)

    Esses métodos recebem por parâmetro uma Func<TModel, TValue>, ou seja, uma função que recebe um Model (classe) e retorna uma propriedade.

    Quando você chama esse método passando por parâmetro uma lambda expression (qualquerCoisa => qualquerCoisa.ClienteId), o C# consegue inferir que o TModel da Func é o mesmo TModel do HtmlHelper. 

    Por isso que o nome do parâmetro pode ser x ou qualquerCoisa. Ele já sabe que isso é a instância da classe que você determinou como model, no caso um Cliente.

    quinta-feira, 8 de outubro de 2015 04:02

Todas as Respostas

  • O que fica parecendo (na minha visão de leigo) é que qualquer variável que eu criar ali (onde coloquei o x) ira referenciar à classe indicada no início do arquivo. É isso mesmo?

    Sim. Pode ser @Html.TextBoxFor(qualquerCoisa => qualquerCoisa.ClienteId).

    Não atrapalharia caso eu quisesse usar na expressão lambda um parâmetro de outro tipo que não seja a classe (nesse caso a classe Cliente)?

    O importante é entender que a expressão lambda (que é um atalho para uma Func) está retornando uma propriedade. Essa propriedade pode ser de qualquer classe. Exemplo: @Html.TextBoxFor(qualquerCoisa => new Carro().CarroId).

    quinta-feira, 8 de outubro de 2015 02:06
  • Bacana Edney, 

    mas a questão é que o exemplo que você passou, a sintaxe é bem inteligível pra mim, uma vez que você declara (no seu exemplo) qual a classe.propriedade que será utilizada.

    O que não consigo entender (e sempre é melhor entender do que apenas decorar) é como a linguagem entende que qualquerCoisa tem a propriedade .ClienteId. Porque pelo que eu entendo, apenas por escrever qualquerCoisa, essa qualquerCoisa já virou automaticamente uma instância da classe Cliente (meu exemplo).

    Sei que pode parecer uma discussão em torno de algo banal, é que para mim, entender isso facilitaria à entender o funcionamento das Func nesse contexto.

    Obrigado!

    quinta-feira, 8 de outubro de 2015 02:33
  • Vamos lá:

    Quando você usa a propriedade Html (@Html), você está usando uma instância da classe HtmlHelper<TModel> instanciada pelo MVC. Automaticamente, pelo genérico TModel, o HtmlHelper sabe que o Model, no seu caso, é a classe Cliente.

    Os métodos TextBoxFor, LabelFor, etc., são métodos de extensão da classe HtmlHelper. A assinatura deles é assim:

    public static MvcHtmlString TextBoxFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)

    Esses métodos recebem por parâmetro uma Func<TModel, TValue>, ou seja, uma função que recebe um Model (classe) e retorna uma propriedade.

    Quando você chama esse método passando por parâmetro uma lambda expression (qualquerCoisa => qualquerCoisa.ClienteId), o C# consegue inferir que o TModel da Func é o mesmo TModel do HtmlHelper. 

    Por isso que o nome do parâmetro pode ser x ou qualquerCoisa. Ele já sabe que isso é a instância da classe que você determinou como model, no caso um Cliente.

    quinta-feira, 8 de outubro de 2015 04:02