2016-07-28 25 views
2

なぜ私はそれが剃刀に必要なのか分からないので、ラムダ表記の私の理解は欠けていると思います。これに代えてRazorにラムダ表記が必要なのはなぜですか?

:たとえば

@Html.DisplayFor(item.FirstName) 

は、ラムダ構文の目的は何で、なぜ私たちは中に追加する必要があります:

@Html.DisplayFor(modelItem => item.FirstName) 

は、なぜ私たちはこれを持つことができませんラムダ記法を打ち込む余分な作業はすべて?

これがなぜ必要なのか、それが何のメリットがあるのか​​理解してくれる人がいますか?

+0

実際にMVCではなく、カミソリの一部です。 – SLaks

答えて

4

HtmlHelperのメソッドは、式ツリーをパラメータとして取ります。

これにより、通過した実際のプロパティが表示され、その属性を観察できるようになります。

+0

いずれにしても、パラメータを正しく送信していますか? –

+0

はい、式ツリーでは、 'PropertyInfo'も見ることができます。それ以外の場合は、書式設定属性を使用する方法がありません。 – SLaks

+0

申し訳ありませんが、PropertyInfoは何ですか? –

6

Razorビューでのラムダ式の目的は、モデルによって無名関数(名前のない関数)から与えられた値を返すことです。あなたの最初の例に見てみましょう:

@Html.DisplayFor(modelItem => item.FirstName) 

は次のように変換されます:Modelとして宣言された関数のパラメータとして与えられた。ここ

@Html.DisplayFor(String Function(Model modelItem) 
{ 
    return item.FirstName; 
}) 

modelItem、と応じたプロパティ値を返すために、関数の本体としての声明を返しますon get/setオペレーション。

我々はDisplayForヘルパー宣言にさらに見れば:前@SLaksで述べたように式ツリーは、モデルに定義のタイプからベースビューに適切なHTMLタグを生成するためのパラメータとして解析することができ、

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

それを実行する代わりに@modelディレクティブによって。

第2引数のExpression<Func<TModel, TValue>>は、指定された関数パラメータが常にモデルと同じ型を持つことを保証する宣言です。この方法では、適切な時刻に特定のプロパティ値を取得するためにHTMLヘルパーが必要とするGetPropertyGetValueを使用するリフレクションコードを削除します。のは、第二の例を調べてみましょう、その後

var model = html.ViewData.Model; 
var value = String.Empty; 

if (model != null) 
{ 
    var type = typeof(TModel); 
    var propertyInfo = type.GetProperty(templateName); 
    var propertyValue = propertyInfo.GetValue(model); 
    value = propertyValue.ToString(); 
} 

@Html.DisplayFor(item.FirstName) 

ここDisplayForObjectを使用します。ここ

は、ラムダ構文することによって排除することができるHTMLヘルパー宣言の内部反射コードの例です。パラメータタイプとして、どのタイプを事前割り当てするかを正確に判断できないと考えて、System.Objectに設定します。このメソッドは、汎用コードでモデル定義タイプをTModelとして提供しないため、プロパティ値を扱う際には、おそらく反映が必要です。

何か改善と提案を歓迎します。

参考文献:

https://msdn.microsoft.com/en-us/library/hh833706%28v=vs.118%29.aspx

http://odetocode.com/blogs/scott/archive/2012/11/26/why-all-the-lambdas.aspx

I want to understand the lambda expression in @Html.DisplayFor(modelItem => item.FirstName)

関連する問題