2009-11-13 4 views
0

Я использую общие классы данных, поэтому я не могу использовать атрибуты сервисов ria для управления моей проверкой - так что я ищу способ ручной настройки проверки для работы в DataForm.Проверка Silverlight MVVM в DataForm

public partial class DataValue 
    { 
     private Dictionary<string, string> _errors = new Dictionary<string, string>(); 

     public Dictionary<string, string> Errors 
     { 
      get { return _errors; } 
     } 

     public Object Value 
     { 
      get 
      { 
       object result = new object(); 
       switch ((DataType)this.ModelEntity.ModelItem.DataType) 
       { 
        case DataType.Money: 
         return result = this.ValueText.ParseNullableFloat(); 
        case DataType.Integer: 
         return result = this.ValueText.ParseNullableInt(); 
        case DataType.Date:       
        case DataType.Time: 
         return result = this.ValueText.ParseNullableDateTime(); 
        case DataType.CheckBox: 
         return result = this.ValueText; 
        default: 
         return result = this.ValueText; 
       }     
      } 

      set 
      { 
       if (!String.IsNullOrEmpty(value.ToString())) 
       { 
        bool invalid = false; 
        switch ((DataType)this.ModelEntity.ModelItem.DataType) 
        { 
         case DataType.Money: 
          float val; 
          if (!float.TryParse(value.ToString(), out val)) invalid = true; 
          break; 
         case DataType.Integer: 
          int val2; 
          if (!Int32.TryParse(value.ToString(), out val2)) invalid = true; 
          break; 
         case DataType.Date: 
         case DataType.Time: 
          DateTime val3; 
          if (!DateTime.TryParse(value.ToString(), out val3)) invalid = true; 
          break; 
        } 
        if (invalid == false) 
         ValueText = value.ToString(); 
        else 
        { 
         ValueText = ""; 
         _errors.Add(this.ModelEntity.LocalName, "error writing " + value.ToString() + " to " + this.ModelEntity.ModelItem.Label); 
        } 
       } 
       else 
        ValueText = ""; 

      } 
     } 

общественный частичный класс ModelValidater: INotifyPropertyChanging, INotifyPropertyChanged {

private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty); 

    private int _ModelValidatorId; 

    private int _ModelEntityId; 

    private int _ValidatorType; 

    private string _ValidatorParameters; 

Таким образом, в ASP MVC, я просто проверить вручную против этих правил, когда форма была представлена ​​... который я предполагаю, в значительной степени что я хочу делать в MVVM (я просто не уверен, что это лучший способ сделать это).

ASP код

protected bool ModelErrors(RecordDictionary record) 
     { 
      bool result = false; 
      foreach (var field in record) 
      { 
       foreach (var error in field.Value.Errors) 
       { 
        result = true; 
        ModelState.AddModelError(error.Key + "Validation", error.Value.ToString()); 
       } 
      } 
      return result; 
     } 

ответ

0

Silverlight 3 встроенной проверки основана на исключениях.

Просто введите осмысленное исключение в свой общий сеттер, и все должно быть в порядке. Не забудьте установить ValidatesOnException = True и NotifyOnValidationError = True на ваш {Binding}.

Jesse имеет a good sample подтверждения с исключениями в своем блоге.

0

Атрибуты проверки можно прикрепить с помощью атрибута MetadataTypeAttribute.
RIA Services автоматически генерирует эти проверки на клиенте для вас, как только они будут показаны в DomainService.

Пример:

[MetadataType(typeof(ContactMd))] 
public partial class Contact 
{ 
    internal class ContactMd 
    { 
     [MyCustomValidation] 
     public string Name { get; set; } 
    } 
} 

(MyCustomValidation относится к чему-либо, что наследует от ValidationAttribute).