-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); }
}

null メッセージが表示され、リソース ファイルにメッセージがあり、公開されています。これは 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;
    }
}
4

1 に答える 1

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;
于 2012-08-27T17:39:42.417 に答える