Поиск пользовательских атрибутов при использовании свойств модели при привязке модели

Я нашел много информации о внедрении настраиваемого связующего объекта для целей проверки, но я не видел многого о том, что я пытаюсь сделать.

Я хочу иметь возможность манипулировать значениями, которые будет привязывать модельное связующее на основе атрибутов свойства в модели представления. Например:

public class FooViewModel : ViewModel
{
    [AddBar]
    public string Name { get; set; }
}

AddBar - это просто

public class AddBarAttribute : System.Attribute
{
}

Мне не удалось найти чистый способ найти атрибуты в свойстве модели представления в методе BindModel с использованием специализированной модели. Это работает, но кажется, что должно быть более простое решение:

public class FooBarModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = base.BindModel(controllerContext, bindingContext);

        var hasBarAttribute = false;

        if(bindingContext.ModelMetadata.ContainerType != null)
        {
            var property = bindingContext.ModelMetadata.ContainerType.GetProperties()
                .Where(x => x.Name == bindingContext.ModelMetadata.PropertyName).FirstOrDefault();
            hasBarAttribute = property != null && property.GetCustomAttributes(true).Where(x => x.GetType() == typeof(AddBarAttribute)).Count() > 0;
        }

        if(value.GetType() == typeof(String) && hasBarAttribute)
            value = ((string)value) + "Bar";

        return value;
    }
}

Существует ли более чистый способ просмотра атрибутов свойства модели представления или другого атрибута, который я мог бы использовать? Атрибуты DataAnnotation действительно кажутся для другой проблемы.

UPDATE

Крэйг отвел меня в нужное место, но я подумал, что приведу несколько примеров для других.

Поставщик метаданных, в котором я оказался, выглядит как

public class FooBarModelMetadataProvider : 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);

        if(attributes.OfType<AddBarAttribute>().Any())
            metaData.AdditionalValues.Add("AddBarKey", true);

        return metaData;
    }
}

Модельное связующее выглядит так:

public class FooBarModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = base.BindModel(controllerContext, bindingContext);

        if(bindingContext.ModelMetadata.AdditionalValues.ContainsKey("AddBarKey"))
            value = ((string)value) + "Bar";

        return value;
    }
}

Ответ 1

"Правильный" способ (для парня, который его написал) - написать поставщик метаданных модели. Вот пример по ссылке. Не совсем "просто", но он работает, и вы будете делать то, что делает остальная часть MVC.