Question

J'utilise Asp.Net MVC 2, et en essayant de itérer à travers les métadonnées pour ajouter des contrôles d'entrée aux colonnes de la grille. La plupart des attributs tels que DisplayAttribute, attribut StringLength, etc ne sont pas remplis par le fournisseur de modelmetadata par défaut.

1- Je pense que ces attributs vont être pris en charge dans MVC3, droit?

2- Y at-il un fournisseur personnalisé que je peux utiliser jusqu'à ce que MVC3 est, je me souviens avoir vu un fournisseur de métadonnées personnalisées (a pensé qu'il était en MvcContrib) mais n'a pas pu le trouver là, tout le monde sait où trouver les metadataprovider supportant ces attributs ?

Était-ce utile?

La solution

J'ai écrit un fournisseur pour gérer plus d'attributs que le fournisseur standard ne. Voici l'idée:

/// <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;
    }
}

Bien sûr, les modèles par défaut avec MVC ne font rien avec cette info. Vous devez vous-même personnaliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top