我想强制系统中的所有日期均有效且不是将来的日期,因此我在自定义模型绑定器中强制执行它们:
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 {
}
现在,问题是:如何检查该属性是否存在于BindModel
method?
绑定期间Model财产,我们可以通过以下方式联系财产所有者:
bindingContext.ModelMetadata.ContainerType
.
所以下面的代码片段应该给你变量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) ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)