ASP.NET MVC ModelMetaData:RequiredAttributeに基づいてIsRequiredこの設定をする方法はありますか?
-
12-09-2019 - |
質問
ブラッド・ウィルソンは、ASP.NET MVCの新ModelMetaDataに偉大なブログのシリーズを投稿しました: のhttp://bradwilson.typepad .COM /ブログ/ 2009/10 / ASPNET-MVC-2-テンプレート - パート2 - modelmetadata.htmlする
その中で、彼はModelMetaDataクラスは、現在のビューとテンプレートヘルパーにさらされている方法を説明します。私は何をしたいのですが、フィールドが必要な場合、私はModelMetaDataのIsRequiredこのプロパティを使用して考えたフォームフィールドのラベルの横にアスタリスクが表示されています。しかし、それはすべてNULL可能な特性のために偽のですが、すべての非NULL可能な特性のために真である、デフォルトでIsRequiredこの。問題は、文字列は常にNULL可能です、ですので、IsRequiredこのプロパティは常に文字列の場合はfalseです。誰もがIsRequiredこのが設定されている方法のデフォルトを上書きする方法を知っていますか?また、私は私が私の性質を飾ってきたRequiredAttribute属性を活用について考えたが、RequiredAttributeはModelMetaDataクラスを介して公開されていないようです。誰もがこの問題を回避する方法を知っていますか?
事前に感謝します。
解決
あなたはあなた自身のModelMetadataProviderを作成する必要があります。ここでDataAnnotationsModelBinderを使用した例です。
public class MyMetadataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(Collections.Generic.IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
var _default = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
_default.IsRequired = attributes.Where(x => x is RequiredAttribute).Count() > 0;
return _default;
}
}
次に、Global.asaxの中にあなたのAppStartupに、デフォルトのメタデータプロバイダとしてMyMetadataProviderをフックアップするには、以下を置くことになるでしょう
ModelMetadataProviders.Current = new MyMetadataProvider();