asp.net-mvc - 模型绑定(bind)时查找 View 模型属性上的自定义属性

标签 asp.net-mvc custom-attributes model-binding

我发现了很多有关实现用于验证目的的自定义模型绑定(bind)程序的信息,但我还没有看到太多关于我正在尝试做什么的信息。

我希望能够根据 View 模型中属性的属性来操作模型绑定(bind)器要设置的值。例如:

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

AddBar 只是

public class AddBarAttribute : System.Attribute
{
}

我无法找到一种干净的方法来在自定义模型绑定(bind)程序的 BindModel 方法中查找 View 模型属性上的属性。这可行,但感觉应该有一个更简单的解决方案:

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

是否有更清晰的方法来查看 View 模型属性上的属性或我可以使用的不同类型的属性? 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;
    }
}

模型绑定(bind)器看起来像:

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

最佳答案

“正确”的方法(根据写它的人)是 write a model metadata provider 。链接中有一个示例。并不完全“简单”,但它有效,并且您将执行 MVC 其余部分所做的事情。

关于asp.net-mvc - 模型绑定(bind)时查找 View 模型属性上的自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6205176/

相关文章:

jquery - 页面加载时 - Knockout/Javascript 有 1-4 秒的延迟

php - Magento 2.0 - 如何获取客户多选属性选项值

c# - `[FromQuery]` IEnumerable<SomeObject> 在 ASP.NET Core 3.1 中解析?

jquery - 为什么 jquery 需要一个 ui 对话框的选择器

c# - 生成的 Entity Framework 代码

c# - 在升级的MVC项目中使用ExceptionFilterAttribute

c# - 模型绑定(bind)绑定(bind)我的 json 数组,但不绑定(bind)值

c# - 如何为 body 模型上的属性提供自定义模型 Binder ?

asp.net-mvc - ASP.NET MVC 5 模型绑定(bind)编辑 View

c# - 如何枚举具有自定义类属性的所有类?