0

Шаблон «Silverlight Business Application» в комплекте с VS2010/Silverlight 4 использует DataAnnotations на аргументы метода в своем классе службы домена, которые вызываются автоматически:Проверяющие аргументы метода с аннотацией данных атрибутов

 public CreateUserStatus CreateUser(RegistrationData user, 
     [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ValidationErrorResources))] 
     [RegularExpression("^.*[^a-zA-Z0-9].*$", ErrorMessageResourceName = "ValidationErrorBadPasswordStrength", ErrorMessageResourceType = typeof(ValidationErrorResources))] 
     [StringLength(50, MinimumLength = 7, ErrorMessageResourceName = "ValidationErrorBadPasswordLength", ErrorMessageResourceType = typeof(ValidationErrorResources))] 
     string password) 
    { /* do something */ } 

Если мне нужно реализовать это в моих методах класса POCO, как мне заставить фреймворк вызывать проверки или как я могу принудительно выполнить проверку на всех аргументах (используя Validator или иначе?).

ответ

1

Мы подошли к нему, как это:

У нас есть класс ValidationProperty, который принимает в RegularExpression, который будет использоваться для проверки значения (можно использовать все, что вы хотели).

ValidationProperty.cs

public class ValidationProperty 
{ 
    #region Constructors 

    /// <summary> 
    /// Constructor for property with validation 
    /// </summary> 
    /// <param name="regularExpression"></param> 
    /// <param name="errorMessage"></param> 
    public ValidationProperty(string regularExpression, string errorMessage) 
    { 
     RegularExpression = regularExpression; 
     ErrorMessage = errorMessage; 
     IsValid = true; 
    } 

    #endregion 

    #region Properties 

    /// <summary> 
    /// Will be true if this property is currently valid 
    /// </summary> 
    public bool IsValid { get; private set; } 

    /// <summary> 
    /// The value of the Property. 
    /// </summary> 
    public object Value 
    { 
     get { return val; } 
     set 
     { 
      if (this.Validate(value))//if valid, set it 
      { 
       val = value; 
      } 
      else//not valid, throw exception 
      { 
       throw new ValidationException(ErrorMessage); 
      } 
     } 
    } 
    private object val; 

    /// <summary> 
    /// Holds the regular expression that will accept a vaild value 
    /// </summary> 
    public string RegularExpression { get; private set; } 

    /// <summary> 
    /// The error message that will be thrown if invalid 
    /// </summary> 
    public string ErrorMessage { get; private set; } 

    #endregion 

    #region Private Methods 

    private bool Validate(object myValue) 
    { 
     if (myValue != null)//Value has been set, validate it 
     { 
      this.IsValid = Regex.Match(myValue.ToString(), this.RegularExpression).Success; 
     } 
     else//still valid if it has not been set. Invalidation of items not set needs to be handled in the layer above this one. 
     { 
      this.IsValid = true; 
     } 

     return this.IsValid; 
    } 

    #endregion 
} 

Вот как мы бы создать свойство Validation. Обратите внимание, как открытый член является строкой, но в частном порядке я использую «ValidationProperty».

public string TaskNumber 
    { 
     get { return taskNumber.Value.ToString(); } 
     set 
     { 
      taskNumber.Value = value; 
      OnPropertyChanged("TaskNumber"); 
     } 
    } 
    private ValidationProperty taskNumber; 

Теперь, когда значение установлено, бизнес-уровень будет проверять, что это допустимое значение. Если это не так, это просто вызовет новое исключение ValidationException (в классе ValidationProperty). В вашем xaml вам нужно будет установить NotifyOnValidationError & ValidatesOnExceptions в true.

<TextBox Text="{Binding TaskNumber, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}"/> 

При таком подходе, вы, вероятно, имеют форму для создания нового пользователя «», а каждое поле будет valitate каждый раз, когда они устанавливают его (я надеюсь, что имеет смысл).

Это подход, который мы использовали, чтобы получить подтверждение на бизнес-уровне. Я не уверен, что это именно то, что вы ищете, но я надеюсь, что это поможет.

+0

Когда я прочитал ваш вопрос, я понял, что раньше не читал его :(Я думал, что вы создаете свойство и пытаетесь проверить свойство на своем объекте, а не на методе. Думаю, я никогда не делал то, что вы пытаетесь сделать, но, возможно, мой ответ зажжет некоторые идеи для вас. Извините! – JSprang

+0

Не беспокойтесь - спасибо за ответ. Большинство из того, что вы пытаетесь сделать, могут быть решены с помощью DataAnnotations. INotifyDataErrorInfo и INotifyPropertyChanged (или просто подкласс System.ServiceModel.DomainServices.Client.Entity), и вы можете получить ошибку проверки UX для «free» с помощью элемента ValidationSummary. Вы можете написать специальные декодеры проверки, расширив System.ComponentModel.DataAnnotations.ValidationAttribute , или даже указать на существующий метод проверки в вашем коде, используя System.ComponentModel.DataAnnotations.CustomVal атрибут idation. – lo5

+1

Да, это то, что мы делаем. Мы используем этот подход, хотя вместо DataAnnotations, чтобы мы могли иметь логику проверки на бизнес-уровне, если это имеет смысл. – JSprang