13

Brad Wilsonは、ASP.NET MVCの新しいModelMetaDataにすばらしいブログシリーズを投稿しました:http: //bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.html

その中で、彼はModelMetaDataクラスがビューとテンプレート化されたヘルパーでどのように公開されるかを説明しています。フィールドが必要な場合は、フォームフィールドラベルの横にアスタリスクを表示したいので、ModelMetaDataのIsRequiredプロパティを使用することを検討しました。ただし、IsRequiredは、デフォルトではnull許容でないすべてのプロパティに対してtrueですが、null許容可能なすべてのプロパティに対してはfalseです。問題は、文字列は常にnull許容であるため、文字列のIsRequiredプロパティは常にfalseです。IsRequiredが設定されているデフォルトをオーバーライドする方法を知っている人はいますか?または、プロパティを装飾してきたRequiredAttribute属性を利用することを考えましたが、RequiredAttributeはModelMetaDataクラスを介して公開されていないようです。誰かがこの問題を回避する方法を知っていますか?

前もって感謝します。

4

1 に答える 1

17

独自の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();
于 2009-11-02T17:48:27.227 に答える