我目前将我的项目迁移到MVC 2,并且在使用默认模型绑定和验证时IDataErrorInfo似乎不起作用。它被切断了吗?在MVC 2中进行模型验证时IDataErrorInfo是否被忽略?
回答
摘要
我张贴这种错误MVC 2的问题跟踪:http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=4891
它将在明年预览版中得到解决。
DefaultModelBinder在MVC 1.0:
protected virtual void OnPropertyValidated(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
{
IDataErrorInfo model = bindingContext.Model as IDataErrorInfo;
if (model != null)
{
string str = model[propertyDescriptor.Name];
if (!string.IsNullOrEmpty(str))
{
string key = CreateSubPropertyName(bindingContext.ModelName, propertyDescriptor.Name);
bindingContext.ModelState.AddModelError(key, str);
}
}
}
DefaultModelBinder在MVC 2.0的β:
protected virtual void OnPropertyValidated(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
{
ModelMetadata metadata = bindingContext.PropertyMetadata[propertyDescriptor.Name];
metadata.Model = value;
string prefix = CreateSubPropertyName(bindingContext.ModelName, metadata.PropertyName);
foreach (ModelValidator validator in metadata.GetValidators(controllerContext))
{
foreach (ModelValidationResult result in validator.Validate(bindingContext.Model))
{
bindingContext.ModelState.AddModelError(CreateSubPropertyName(prefix, result.MemberName), result.Message);
}
}
if ((bindingContext.ModelState.IsValidField(prefix) && (value == null)) && !TypeHelpers.TypeAllowsNullValue(propertyDescriptor.PropertyType))
{
bindingContext.ModelState.AddModelError(prefix, GetValueRequiredResource(controllerContext));
}
}
它不使用IDataErrorInfo的这个[字符串COLUMNNAME]属性...好像一个错误,因为DefaultModelBinder仍然使用Error属性。至少是不一致的。
编辑
我用反射镜,发现DataErrorInfoPropertyModelValidator似乎并没有被使用,所以我创建了自己的类:
public class DataErrorInfoModelPropertyValidatorProvider : ModelValidatorProvider
{
// Methods
public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
{
if (metadata == null)
{
throw new ArgumentNullException("metadata");
}
if (context == null)
{
throw new ArgumentNullException("context");
}
var validators = new List<ModelValidator>();
validators.Add(new DataErrorInfoPropertyModelValidator(metadata, context));
return validators;
}
internal sealed class DataErrorInfoPropertyModelValidator : ModelValidator
{
// Methods
public DataErrorInfoPropertyModelValidator(ModelMetadata metadata, ControllerContext controllerContext)
: base(metadata, controllerContext)
{
}
public override IEnumerable<ModelValidationResult> Validate(object container)
{
if (container != null)
{
IDataErrorInfo info = container as IDataErrorInfo;
if (info != null)
{
string str = info[Metadata.PropertyName];
if (!string.IsNullOrEmpty(str))
{
ModelValidationResult[] resultArray = new ModelValidationResult[1];
ModelValidationResult result = new ModelValidationResult();
result.Message = str;
resultArray[0] = result;
return resultArray;
}
}
}
return Enumerable.Empty<ModelValidationResult>();
}
}
}
然后我用:
ModelValidatorProviders.Providers.Add(new DataErrorInfoModelPropertyValidatorProvider());
它工作:)这只是临时解决方案。将要在最后的MVC 2
编辑
我也改变if (base.Metadata.Model != null)
到如果(容器!= NULL)在DataErrorInfoPropertyModelValidator
Validate()
方法进行修正。
上面示例中对ModelValidator.Validate()的调用应最终调用到IDataErrorInfo中。你能否详细解释“似乎不起作用”? – Levi 2009-11-19 23:03:20
Hi5。很好的工作。应该将这个bug发布给Scott Gu或其他MVC家伙的博客 - 然后可以快速修复。 – 2009-11-22 09:37:42
@cottsak:我确实发布了它来发布跟踪器。下一个预览版本应该删除该问题:http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=4891 – LukLed 2009-11-22 11:58:45
这当然是在MVC 2 Preview 2中。看看DefaultModelBinder.OnPropertyValidating
和OnModelUpdated
。
它从OnPropertyValidating中删除,但不是OnModelUpdated。 OnPropertyValidating是我所需要的。有合适的错误,因为它显示不一致。 – LukLed 2009-11-19 20:38:32
很可能,我在早期的MVC 1.0预览中发现了这样的错误。它应该被支持,但也许你是对的。我还使用xVal在MVC 1.0中获得了我的功能,但会考虑MVC 2.0中的新增功能。很高兴知道这可能需要工作。 – 2009-11-22 09:35:50
- 1. 模型验证失败FactoryGirl Rspec,验证似乎被忽略
- 2. 如何使用Web API 2在MVC中进行模型验证?
- 3. 如何在asp.net中进行整数模型验证mvc 2
- 4. asp.net mvc 2 global.asax.cs被忽略
- 5. asp.net mvc使用ViewModel时进行IDataErrorInfo验证
- 6. mvc和jquery - 模型会被忽略吗?
- 7. WPF DataBinding验证被忽略
- 8. 忽略IDataErrorInfo通知
- 9. ASP.NET MVC模型验证忽略已变为只读的输入
- 10. 如何判断在SVN中忽略文件是否被忽略?
- 11. MVC 2模型验证消息
- 12. 验证JAXB,但空白不被忽略
- 13. MVC模型验证
- 14. HTML需要验证被Angular忽略吗?
- 15. CakePHP - 订单中$ hasMany模型被忽略
- 16. 模型中的MVC验证
- 17. 来验证模型在ASP.NET MVC 2视图模型有道apporach
- 18. 使用NancyFX进行模型验证
- 19. .Net 3.5元数据类型在使用验证器时被忽略
- 20. 在UI中使用数据模板时未触发IDataErrorInfo验证
- 21. 棱镜IDataErrorInfo的验证与DataAnnotation在视图模型实体
- 22. 媒体查询被模型忽略
- 23. Laravel 5.2模型$可填写被忽略?
- 24. 流轨 - 模型方法activity_should_sync?被忽略
- 25. ASP.NET MVC模型验证总是失败
- 26. 使用自定义验证程序时弹出验证注释被忽略
- 27. invalidHandler setDefault在$ .validator调用中被忽略-jquery验证插件
- 28. 表单身份验证超时被忽略
- 29. 忽略隐藏在验证中的div
- 30. 在asp.net mvc 2.0中进行modelstate验证
啊,这是很好的知道。我刚刚使用xVal进行了验证,将其与Linq to Sql集成的关键部分依赖于IDataErrorInfo来利用好友类。 我希望这个支持在它发布之前被添加到Mvc 2中... – Dusda 2009-11-19 20:52:55