Asp.net mvc 在模型绑定时查找视图模型属性上的自定义属性

Asp.net mvc 在模型绑定时查找视图模型属性上的自定义属性,asp.net-mvc,custom-attributes,model-binding,Asp.net Mvc,Custom Attributes,Model Binding,我已经找到了很多关于实现用于验证目的的定制模型绑定器的信息,但是我没有看到太多关于我尝试做什么的信息 我希望能够操纵模型绑定器将根据视图模型中属性的属性设置的值。例如: public class FooViewModel : ViewModel { [AddBar] public string Name { get; set; } } AddBar只是 public class AddBarAttribute : System.Attribute { } 在自定义模型绑定器的

我已经找到了很多关于实现用于验证目的的定制模型绑定器的信息,但是我没有看到太多关于我尝试做什么的信息

我希望能够操纵模型绑定器将根据视图模型中属性的属性设置的值。例如:

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属性似乎是针对另一个问题的

更新

克雷格的回答把我带到了正确的地方,但我想我应该在这里为其他人举一些例子

我最终得到的元数据提供程序如下所示

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

“正确”的方法(根据作者)是。链接中有一个例子。不完全是“简单”,但它是有效的,你将做MVC其他部分所做的事情。

我认为在跟随你的链接之后这是有意义的,但现在我不太确定。实际上,我并不想更改任何数据注释属性的值,而是基于新属性更改模型本身的值(通过在上面示例的末尾添加“Bar”)。调用metaData.Model+=“Bar”似乎对任何事情都没有任何影响。将自定义标记添加到模型元数据后,您可以更改模型绑定器以识别它们。感谢您的指针。我已经根据你分享的链接用一些例子更新了主要帖子。
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;
    }
}