Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在MVC2中的模型验证过程中是否忽略IDataErrorInfo?_Asp.net Mvc_Validation_Asp.net Mvc 2_Idataerrorinfo - Fatal编程技术网

Asp.net mvc 在MVC2中的模型验证过程中是否忽略IDataErrorInfo?

Asp.net mvc 在MVC2中的模型验证过程中是否忽略IDataErrorInfo?,asp.net-mvc,validation,asp.net-mvc-2,idataerrorinfo,Asp.net Mvc,Validation,Asp.net Mvc 2,Idataerrorinfo,我目前将我的项目迁移到MVC2,而IDataErrorInfo在使用默认模型绑定和验证时似乎不起作用。它被剪掉了吗?它肯定在MVC2预览2中。查看DefaultModelBinder.OnPropertyValidating和OnModelUpdated摘要 我将此错误发布到MVC 2问题跟踪程序: 它将在下一个预览版本中解决 MVC 1.0中的DefaultModelBinder: protected virtual void OnPropertyValidated(ControllerCo

我目前将我的项目迁移到MVC2,而IDataErrorInfo在使用默认模型绑定和验证时似乎不起作用。它被剪掉了吗?

它肯定在MVC2预览2中。查看
DefaultModelBinder.OnPropertyValidating
OnModelUpdated

摘要

我将此错误发布到MVC 2问题跟踪程序:

它将在下一个预览版本中解决


MVC 1.0中的DefaultModelBinder:

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);
        }
    }
}
MVC 2.0测试版中的DefaultModelBinder:

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此[string columnName]属性。。。似乎是个bug,因为DefaultModelBinder仍然使用Error属性。这至少是不一致的

编辑

我使用了reflector并注意到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>();
        }
    }
}
这只是暂时的解决办法。必须在最终MVC 2中进行更正

编辑


我还在
Validate()中将
if(base.Metadata.Model!=null)
更改为if(container!=null)
DataErrorInfoPropertyModelValidator的方法

它将从OnPropertyValidating中删除,但不会在ModelUpdated中删除。OnProperty验证是我所需要的。很可能有bug,因为它显示了不一致性。很可能,我在早期的MVC1.0预览中发现了类似的bug。它应该得到支持,但也许你是对的。我还使用xVal获得了MVC1.0中的功能,但我将关注MVC2.0中的新增功能。很高兴知道这可能需要工作。啊,很高兴知道。我刚刚用xVal实现了验证,将其与Linq集成到Sql的关键部分依赖于IDataErrorInfo来利用buddy类。我希望在MVC2发布之前将此支持添加到MVC2中……上面示例中对ModelValidator.Validate()的调用最终应该调用IDataErrorInfo。你能更详细地解释一下“似乎不起作用”吗。干得不错。应该把这个bug发布到Scott Gu或其他MVC成员的博客上-那就赶快修复吧。@cottsak:我确实把它发布到了issue tracker上了。下一个预览版本应该可以解决这个问题:现在这个问题解决了吗?您可以编辑问题或添加新答案(如果是)。我有点困惑,但也许这是因为450am@Simon:他们为MVC 2 RC安排了修复。MVC2RC在这里,所以它应该是固定的。我没有试过。
ModelValidatorProviders.Providers.Add(new DataErrorInfoModelPropertyValidatorProvider());