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ヘルパーが必要とするGetProperty
とGetValue
を使用するリフレクションコードを削除します。のは、第二の例を調べてみましょう、その後
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)
ここDisplayFor
はObject
を使用します。ここ
は、ラムダ構文することによって排除することができる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)
実際にMVCではなく、カミソリの一部です。 – SLaks