これはC#3.0以降に存在する構文トリックです(私はおそらく3.5かもしれません)。
コンパイルする前にRazorビューをC#コードファイルに変換すると、実際にがになります)、コンパイラは次の2つの方法でコンパイルできます文脈
LabelFor()
メソッドがデリゲートを必要とする場合は、匿名メソッドにコンパイルされます。あるいは、メソッドがSystem.Linq.Expressions.Expression<Func>
タイプを予期する場合、expression treeが構築されます。これはあなたの場合に起こっていることです。
このconvulted構文理由は、式ツリーは、実際のプロパティを抽出することができる(リフレクションと組み合わせて)LabelFor()
方法は、あなたが参照しているために十分な情報が含まれていることです。 LabelFor(Model.UserName)
のように単純に渡す場合は、LabelFor()
でこれを行うには十分な情報がありません。それはちょうどUserName
のプロパティから値を取得します。しかし今、それはどこから来たのかを知っていて、もっと多くのReflectionを使ってプロパティの属性を見ることができます。 DisplayFormat
,Required
などの属性。
m
(またはc
など)は実際のモデルです。 LabelFor
は拡張メソッドであり、モデルをラムダ式に戻すだけで、式ツリー全体が機能するようになります。 LabelFor(x=>Model.UserName)
のように書くこともできますが、私はそれがうまくいくとは思えません。
@NoProblemBabe、ここでそれをやっている人がいます:http://stackoverflow.com/questions/2595947/asp-net-mvc-label-for –