2012-08-27 64 views
-2

当我使用:本地化数据验证错误

[Required(ErrorMessageResourceType = typeof (Resources), ErrorMessageResourceName = "MessageIISPathRequired")] 
[CustomValidation(typeof (IISVM), "WebsiteRootExists", ErrorMessageResourceType = typeof (Resources), ErrorMessageResourceName = "MessageIISPathInvalid")] 
public string WebsiteRoot 
{ 
    get { return _data.WebsiteRoot; } 
    set { SetProperty("WebsiteRoot",() => _data.WebsiteRoot == value,() => _data.WebsiteRoot = value); } 
} 

我得到一个空消息,并在我的资源文件的消息是存在的,它是公共的。这不是一个MVC应用程序,它是一个WPF桌面应用程序,我的所有验证都在工作,直到我将其转换为使用资源。

我认为这与我如何抓住错误的事:

private static ValidationAttribute[] GetValidations(PropertyInfo property) 
{ 
    return property.GetCustomAttributes(typeof (ValidationAttribute), true) as ValidationAttribute[]; 
} 

private static Func<IISVM, object> GetValueGetter(PropertyInfo property) 
{ 
    LinqExpress.ParameterExpression instance = LinqExpress.Expression.Parameter(typeof (IISVM), "i"); 
    LinqExpress.UnaryExpression cast = 
     LinqExpress.Expression.TypeAs(LinqExpress.Expression.Property(instance, property), 
             typeof (object)); 
    return (Func<IISVM, object>) LinqExpress.Expression.Lambda(cast, instance).Compile(); 
} 

而且我IDataErrorInfo实施

public string this[string columnName] 
{ 
    get 
    { 
     if (PropertyGetters.ContainsKey(columnName)) 
     { 
      object value = PropertyGetters[columnName](this); 
      string[] errors = 
       Validators[columnName].Where(v => !v.IsValid(value)).Select(v => v.ErrorMessage).ToArray(); 
      return string.Join(Environment.NewLine, errors); 
     } 

     return string.Empty; 
    } 
} 

回答

1

发出定额。我不得不使用反射,并尝试验证方法被调用时的属性,而不是用上面的静态方法来计算它。

if (PropertyGetters.ContainsKey(columnName)) 
      { 
       ValidationContext context = new ValidationContext(this, null, null) 
       { 
        MemberName = columnName 
       }; 

       List<ValidationResult> results = new List<ValidationResult>(); 
       var value = GetType().GetProperty(columnName).GetValue(this, null); 

       return !Validator.TryValidateProperty(value, context, results) 
          ? string.Join(Environment.NewLine, results.Select(x => x.ErrorMessage)) 
          : null; 
      } 

      return null;