3
DataAnnotationがパブリックフィールドで機能しないのはなぜですか?例:パブリックフィールドのDataAnnotationsとMVCのプロパティの比較
namespace Models
{
public class Product
{
[Display(Name = "Name")]
public string Title; // { get; set; }
}
}
public ActionResult Test()
{
return View(new Models.Product() { Title = "why no love?" });
}
@Html.LabelFor(m => m.Title) // will return 'Title' if field, or 'Name' if property
@Html.DisplayFor(m => m.Title)
TitleがDisplay属性の場合は無効です。タイトルがプロパティに変更された場合、 "Name"と表示されているように期待どおりに機能します。
この例ではプロパティに変更するのは簡単ですが、F#の型を使用して、フィールドとプロパティを持つクラスにコンパイルします。
これは、属性(TypeDescriptor
)を取得するために使用される反射のようなメカニズムは、プロパティのみをサポートしているので、DataAnnotationsは、フィールドで動作しない理由があるASP.NET 4とMVC RC 3
MVCのJSONシリアライザでは、フィールドとプロパティの両方が返されますが、アノテーションでフィールドが異なる扱いを受ける理由はわかりません。 – yanta
これは、.NETフレームワークの一部が一致しないためです。 DataAnnotationsは、デフォルトではプロパティでのみサポートされています(ただし、フィールドを検査できるMetadataProviderを記述することもできます)。一方、JavaScriptのシリアル化は、フィールドとプロパティの両方をサポートしています。それはちょうど今のやり方です。 – marcind