我找到了造成这种情况的原因,但我的“解决方案”可能会破坏验证器的正常处理。谨慎使用。
我在 DefaultModelBinder 的 OnModelUpdated 函数中发现了一个条件返回语句:
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
IDataErrorInfo errorProvider = bindingContext.Model as IDataErrorInfo;
if (errorProvider != null)
{
string errorText = errorProvider.Error;
if (!String.IsNullOrEmpty(errorText))
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, errorText);
}
}
// BEGIN CONDITION
if (!IsModelValid(bindingContext))
{
return;
}
// END CONDITION
foreach (ModelValidator validator in bindingContext.ModelMetadata.GetValidators(controllerContext))
{
foreach (ModelValidationResult validationResult in validator.Validate(null))
{
bindingContext.ModelState.AddModelError(CreateSubPropertyName(bindingContext.ModelName, validationResult.MemberName), validationResult.Message);
}
}
}
如果我理解这段代码(我可能不理解),似乎 MVC 团队打算在这一点上跳过模型验证器。
我已经制作了自己的自定义 ModelBinder,在其中我重新运行了条件本来可以避免的代码:
public class CustomModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
base.OnModelUpdated(controllerContext, bindingContext);
foreach (ModelValidator validator in bindingContext.ModelMetadata.GetValidators(controllerContext))
{
foreach (ModelValidationResult validationResult in validator.Validate(null))
{
bindingContext.ModelState.AddModelError(CreateSubPropertyName(bindingContext.ModelName, validationResult.MemberName), validationResult.Message);
}
}
}
}
这似乎可以解决问题。