我想强制我的系统中的所有日期都有效,而不是将来,所以我在自定义模型绑定器中强制执行它们:
class DateTimeModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext) { var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); try { var date = value.ConvertTo(typeof(DateTime),CultureInfo.CurrentCulture); // Here I want to ask first if the property has the FutureDateAttribute if ((DateTime)date > DateTime.Today) { bindingContext.ModelState.AddModelError(bindingContext.ModelName,"No se puede indicar una fecha mayor a hoy"); } return date; } catch (Exception) { bindingContext.ModelState.AddModelError(bindingContext.ModelName,"La fecha no es correcta"); return value.AttemptedValue; } } }
现在,除了少数例外,我想允许将来有些日期
[required] [Display(Name = "Future Date")] [DataType(DataType.DateTime)] [FutureDateTime] <-- this attribute should allow the exception public DateTime FutureFecha { get; set; }
这是属性
[AttributeUsage(AttributeTargets.Property,AllowMultiple = false,Inherited = false)] public class FutureDateTimeAttribute : Attribute { }
解决方法
在绑定Model属性期间,我们可以通过以下方式访问属性所有者:
bindingContext.ModelMetadata.ContainerType
.
因此,下面的代码段应该为FutureFecha属性提供变量hasAttribute设置为true
var holderType = bindingContext.ModelMetadata.ContainerType; if (holderType != null) { var propertyType = holderType.GetProperty(bindingContext.ModelMetadata.PropertyName); var attributes = propertyType.GetCustomAttributes(true); var hasAttribute = attributes .Cast<Attribute>() .Any(a => a.GetType().IsEquivalentTo(typeof (FutureDateTime))); if(hasAttribute) ... }