如果这对某人仍然有用:我有类似的要求,但是我的类首先由实体框架数据库生成,因此该项目广泛使用了 [MetadataType] 属性。
我将这个问题的部分拼凑起来,并将问题链接到这个解决方案中,以允许该方法与指定 [AllowHtml] (或类似)的元数据类一起使用
在您的实体框架项目中,定义一个属性:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class SkipRequestValidationAttribute : Attribute
{
}
然后在您的元数据类中,将此属性分配给相关属性:
[MetadataType(typeof(ActivityLogMetadata))]
public partial class ActivityLog
{
}
public class ActivityLogMetadata
{
[Required]
[SkipRequestValidation]
[Display(Name = "Body")]
public string Body { get; set; }
}
现在,在您的 MVC 项目中添加此自定义模型绑定器以查找这些元属性。
public class MyModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var containerType = bindingContext.ModelMetadata.ContainerType;
if (containerType != null)
{
/* Do we have a Metadata attribute class specified for the Type we're binding? */
var metaRedirectInfo = containerType
.GetCustomAttributes(typeof(MetadataTypeAttribute), true)
.OfType<MetadataTypeAttribute>().FirstOrDefault();
if (metaRedirectInfo != null)
{
/* If our Meta class has a definition for this property, check it */
var thisProperty = metaRedirectInfo.MetadataClassType.GetProperty(bindingContext.ModelMetadata.PropertyName);
if (thisProperty != null)
{
var hasAttribute = thisProperty
.GetCustomAttributes(false)
.Cast<Attribute>()
.Any(a => a.GetType().IsEquivalentTo(typeof(SkipRequestValidationAttribute)));
/* If we have a SkipRequestValidation attribute, ensure this property isn't validated */
if (hasAttribute)
bindingContext.ModelMetadata.RequestValidationEnabled = false;
}
}
}
return base.BindModel(controllerContext, bindingContext);
}
}
最后在您的 MVC 项目启动方法(例如 Startup.cs)中,替换默认的模型绑定器:
ModelBinders.Binders.DefaultBinder = new MyModelBinder();