現在、プロジェクトをMVC 2に移行しましたが、デフォルトのモデルバインディングと検証を使用すると、IDataErrorInfoが機能しないようです。切り抜かれていますか?
2 に答える
まとめ
このエラーをMVC2課題追跡システムに投稿しました:http ://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId = 4891
次のプレビューリリースで解決される予定です。
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 this [string 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());
そしてそれは機能します:)これは単なる一時的な解決策です。最終的なMVC2で修正する必要があります。
編集
また、。のメソッドでif (base.Metadata.Model != null)
if(container!= null)に変更しました。Validate()
DataErrorInfoPropertyModelValidator
それは確かにMVC2プレビュー2にあります。とを見てDefaultModelBinder.OnPropertyValidating
くださいOnModelUpdated
。