【问题标题】:Silverlight MVVM Validation in a DataForm数据表单中的 Silverlight MVVM 验证
【发布时间】:2009-11-13 02:06:44
【问题描述】:

我正在使用通用数据类,所以我不能使用 ria 服务属性来控制我的验证 - 所以我正在寻找一种方法来手动设置验证以在 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;
        }

【问题讨论】:

    标签: silverlight mvvm


    【解决方案1】:

    Silverlight 3 内置验证基于异常。

    只需在您的通用 Setter 中抛出一个有意义的异常,就可以了。 请记住在您的 {Binding} 上设置 ValidatesOnException=True 和 NotifyOnValidationError=True。

    Jesse 在他的博客上有a good sample 的验证,但有例外。

    【讨论】:

      【解决方案2】:

      您可以使用MetadataTypeAttribute 属性附加验证属性。
      一旦它们暴露在 DomainService 中,RIA 服务将自动在客户端上为您生成这些验证。

      例子:

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

      MyCustomValidation 指的是从ValidationAttribute 继承的任何东西)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        • 2014-01-29
        相关资源
        最近更新 更多