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