2009-11-13 63 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继承)。