1

プロパティに Description 属性を設定しましたが、ModelMetada の Description プロパティは null です。

[Description("sss")]
public int Id { get; set; }

ところでI've putted正しいですか?

編集

MVCソースを見てきました。バグではないようです。説明属性はまったく使用されません。Metadata クラスにはプロパティがありますが、このプロパティは設定も呼び出しもされません。CreateMetadata メソッドには、説明属性を操作するコードがありません。解決策は、create メソッドをオーバーライドし、テンプレートも編集することです。

4

4 に答える 4

2

これは古い投稿ですが、これにも遭遇し、cfeduke とは少し異なる解決策があります。他の誰かがここで起こった場合に備えて投稿すると思いました。

少なくとも MVC 3 では、カスタム メタデータ型を定義する必要はなく、プロバイダーだけを定義する必要があります。MVC ソース コードを読むと、メタデータは可能なすべての属性から構築されているわけではなく、いくつかの属性のみから構築されています。

DisplayAttribute は以下を提供します。

  • 説明
  • 短い表示名
  • 透かし
  • 注文

DescriptionAttribute はまったくチェックされないため、モデルで定義されている場合、メタデータは null を反映します。メタデータ属性が設定されていないという問題がある場合は、プロバイダーが実際にそれを読み取っていることを確認してください。

class MyDataAnnotationsModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
    {
        var metaData = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

        // Description - The default provider reads the description from DisplayAttribute.
        // Here we check for a description attribute as well.  This will overwrite anything
        // set before as we assume a Description attribute is more specific.
        DescriptionAttribute descriptionAttribute = attributes.OfType<DescriptionAttribute>().FirstOrDefault();
        if (descriptionAttribute != null)
        {
            metaData.Description = descriptionAttribute.Description;
        }

        return metaData;
    }
}
于 2011-06-14T20:14:26.750 に答える
1

これを機能させる方法を見つけようとしているときに、DataAnnotations フレームワークの現在の化身では Description も Watermark も使用できないというブログ投稿に出くわしました。

おおよそ次のような回避策を思いつきました。

(免責事項: このコードは、構成によって構築されたメタデータ プロバイダーから削除するために、私のコンパイル バージョンから編集されているため、修正しないと直接コンパイルできない可能性があります。)

public class CustomDataAnnotationsModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<System.Attribute> attributes, System.Type containerType, System.Func<object> modelAccessor, System.Type modelType, string propertyName)
    {
        var baseModelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
        var result = new CustomMetadata(modelMetadataProvider, containerType, modelAccessor, modelType, propertyName, attributes.OfType<DisplayColumnAttribute>().FirstOrDefault(), attributes)
        {
            TemplateHint = !string.IsNullOrEmpty(templateName) ?                              templateName : baseModelMetaData.TemplateHint,
            HideSurroundingHtml = baseModelMetaData.HideSurroundingHtml,
            DataTypeName = baseModelMetaData.DataTypeName,
            IsReadOnly = baseModelMetaData.IsReadOnly,
            NullDisplayText = baseModelMetaData.NullDisplayText,
            DisplayFormatString = baseModelMetaData.DisplayFormatString,
            ConvertEmptyStringToNull = baseModelMetaData.ConvertEmptyStringToNull,
            EditFormatString = baseModelMetaData.EditFormatString,
            ShowForDisplay = baseModelMetaData.ShowForDisplay,
            ShowForEdit = baseModelMetaData.ShowForEdit,
            DisplayName = baseModelMetaData.DisplayName
        };
        return result;
    }
}

public class CustomMetadata : DataAnnotationsModelMetadata
{
    private string _description;

    public CustomMetadata(DataAnnotationsModelMetadataProvider provider, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName, DisplayColumnAttribute displayColumnAttribute, IEnumerable<Attribute> attributes)
            : base(provider, containerType, modelAccessor, modelType, propertyName, displayColumnAttribute)
        {
            var descAttr = attributes.OfType<DescriptionAttribute>().SingleOrDefault();
                    _description = descAttr != null ? descAttr.Description : "";
        }

        // here's the really important part
        public override string Description
        {
            get
            {
                return _description;
            }
            set
            {
                _description = value;
            }
        }
}

次に、Application_Start の Global.asax またはモデル メタデータ プロバイダーを登録する場所で、次のようにします。

ModelMetadataProviders.Current = new CustomMetadataProvider();
于 2010-07-08T19:11:09.713 に答える
0

正しい属性はDisplayNameAttributeです。独自の属性を作成できますが、DisplayNameAttributeから派生する必要があります。

于 2010-06-02T01:19:31.503 に答える
0

MVC 3を使用[AdditionalMetadata("AttributeName", "AttributeValue")]している場合は、カスタム属性に使用できます。

拡張メソッドでは、次のようなことを行うことができます。

if (ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).AdditionalValues.ContainsKey("AttributeName")) {    
 return ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).AdditionalValues["AttributeName"].ToString()    
}
于 2011-10-12T19:46:17.290 に答える