0

Asp.Net MVC 2 を使用しており、メタデータを繰り返し処理して入力コントロールをグリッド列に追加しようとしています。DisplayAttribute、StringLength 属性などのほとんどの属性は、デフォルトのモデル メタデータ プロバイダーによって設定されません。

1- これらの属性は MVC3 でサポートされると思いますよね?

2- MVC3 がリリースされるまで使用できるカスタム プロバイダーはありますか? カスタム メタデータ プロバイダー (MVCContrib にあると思われます) を見たのを覚えていますが、そこでは見つかりませんでした。

4

1 に答える 1

0

標準のプロバイダーよりも多くの属性を処理するプロバイダーを作成しました。アイデアは次のとおりです。

/// <summary>
/// Adds support for data annotation attributes omitted from DataAnnotationsModelMetadataProvider
/// </summary>
public class ExtendedDataAnnotationsModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
    {
        var result = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

        DisplayAttribute da = attributes.OfType<DisplayAttribute>().FirstOrDefault();
        if (da != null)
        {
            var autoGenerate = da.GetAutoGenerateFilter();
            if (autoGenerate.HasValue)
            {
                result.AdditionalValues[AdditionalValuesKeys.AutoGenerateFilter] = autoGenerate.Value;
            }
            var groupName = da.GroupName;
            if (!string.IsNullOrEmpty(groupName))
            {
                result.AdditionalValues[AdditionalValuesKeys.GroupName] = groupName;
            }
            if (!string.IsNullOrEmpty(da.Prompt))
            {
                result.Watermark = da.Prompt;
            }
        }

        DisplayColumnAttribute dc = attributes.OfType<DisplayColumnAttribute>().FirstOrDefault();
        if (dc != null)
        {
            var sc = dc.SortColumn;
            if (!string.IsNullOrEmpty(sc))
            {
                result.AdditionalValues[AdditionalValuesKeys.SortColumnName] = sc;
                if (dc.SortDescending)
                {
                    result.AdditionalValues[AdditionalValuesKeys.SortDescending] = true;
                }
            }
        }

        StringLengthAttribute sla = attributes.OfType<StringLengthAttribute>().FirstOrDefault();
        if (sla != null)
        {
            result.AdditionalValues[AdditionalValuesKeys.MaximumStringLength] = sla.MaximumLength;
        }

        return result;
    }
}

当然のことながら、MVC の既定のテンプレートは、実際にはその情報に対して何もしません。自分でカスタマイズする必要があります。

于 2010-11-02T12:49:06.403 に答える