2009-11-13 66 views
0

我正在使用通用數據類,所以我不能使用ria服務屬性來控制我的驗證 - 所以我正在尋找一種方法來設置驗證以在DataForm中工作。DataForm中的Silverlight MVVM驗證

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,在ASP MVC INotifyPropertyChanged的 {

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

    private int _ModelValidatorId; 

    private int _ModelEntityId; 

    private int _ValidatorType; 

    private string _ValidatorParameters; 

所以,我只是手動對這些規則時提交表單......我猜檢查是相當多我想在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內置的驗證是基於例外。

只是在你的通用Setter中拋出一個有意義的異常,你應該沒問題。 記得在{Binding}中設置ValidatesOnException = True和NotifyOnValidationError = True。

傑西有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繼承)。