【问题标题】:How to remove one or more fields from the DataForm.Validating() event in Silverlight 4?如何从 Silverlight 4 中的 DataForm.Validating() 事件中删除一个或多个字段?
【发布时间】:2011-07-01 15:20:56
【问题描述】:

我有一个绑定到一个对象的数据表单,该对象的属性用System.ObjectModel.DataAnnotation 属性修饰以进行验证。

我面临的问题是这个类的一些属性只是有条件需要,不需要验证。例如,当应用的管理员决定编辑用户时, 他或她可以输入密码/密码确认/密码问题/密码答案。或者他/她可能会完全跳过这些属性。

因此,如果管理员决定输入这 4 个字段中的任何一个,它们都必须存在,并且必须应用所有这些字段的验证规则。但是,如果管理员只想更改 FirstName、LastName、Email 或任何其他任意属性 - 不需要验证与密码相关的字段。

有没有办法将它们从验证过程中“排除”?

这是我使用的对象的示例:

public class RegistrationData
{
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string Email { get; set; }
   public string Username { get; set; }
   public string Password { get; set; }
   public string PasswordConfirm { get; set; }
   public string PasswordQuestion { get; set; }
   public string PasswordAnswer { get; set; }
}

我在 Xaml 中有一个名为 registrationForm 的 DataForm,而我得到的错误在此代码中:

private void RegistrationButton_Click(object sender, RoutedEventArgs e)
{
   if( this.registerForm.ValidateItem() )
   {
       //Does not pass validaton if the password properties are not filled in.
   }
}

关于如何解决它的任何想法?

我正在考虑使用两个 DataForms...并将用户对象一分为二,但这涉及大量代码...

【问题讨论】:

  • 请问您是如何进行验证的?更准确地说,您是否使用任何预定义的接口进行错误通知?我问是因为您似乎没有为此使用注册数据类,所以它发生在哪里?
  • 你使用的只是数据注解吗?
  • @Stainedart:是的,我们使用 Silverlight DataForm 和注释属性。对于新用户,我想输入密码,当我编辑用户时,密码字段不应该被验证。在我的情况下,我会很高兴有一个解决方案只是禁用验证。
  • @slfan 如果您使用与数据注释不同的方式查看我在下面的答案,您将获得所需的验证灵活性。

标签: silverlight silverlight-4.0 silverlight-toolkit dataform validation


【解决方案1】:

我建议在 RegistrationData 对象上使用 INotifyDataError 接口。

    public string LabelWrapper
    {
        get
        {
            return this.Label;
        }
        set
        {
            ValidateRequired("LabelWrapper", value, "Label required");
            ValidateRegularExpression("LabelWrapper", value, @"^[\w-_ ]+$", "Characters allowed (a-z,A-Z,0-9,-,_, )");
            this.Label = value;
            this.RaisePropertyChanged("LabelWrapper");
        }
    }

    public string DependentLabelWrapper
    {
        get
        {
            return this.DependentLabel;
        }
        set
        {
            if(LabelWrapper != null){
                ValidateRequired("DependentLabelWrapper", value, "Label required");
                ValidateRegularExpression("LabelWrapper", value, @"^[\w-_ ]+$", "Characters allowed (a-z,A-Z,0-9,-,_, )");
             }
            this.DependentLabel = value;
            this.RaisePropertyChanged("DependentLabelWrapper");
        }
    }

我建议您查看此链接http://blogs.msdn.com/b/nagasatish/archive/2009/03/22/datagrid-validation.aspx 以了解有关不同验证类型的更多信息。

MSDN 对如何使用它也有很好的解释

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo%28VS.95%29.aspx

【讨论】:

  • 感谢您的意见。我知道 INotifyDataError 接口。要写很多代码。我想要的只是暂时禁用验证属性。
【解决方案2】:

This question 给我带来了另一个解决方案。我现在使用 CustomValidation:

[CustomValidation(typeof(RegistrationDataValidation), "ValidatePassword")]
public class RegistrationData  
{  
    public bool IsNewUser { get; set; }
     ... // other registration properties
}  

public static class RegistrationDataValidation
{
    public static ValidationResult ValidatePassword(MembershipServiceUser user, ValidationContext context)
    {
        if (user.IsNewUser && string.IsNullOrEmpty(user.Password))
        {
            return new ValidationResult("Password required");
        }
        return ValidationResult.Success;
    }
}

我添加了一个属性 IsNewUser,我在添加新用户时在客户端中设置了该属性。自定义验证方法检查此属性并执行所需的验证。我仍然在密码上有一个正则表达式属性,该属性也将被验证。

与@Staindart 的解决方案相比,这是在客户端上同步检查的。

【讨论】:

    【解决方案3】:

    最简单和最丑陋的方法是利用 DataForm.ValidatingItem 事件。像这样:

        void dfEditForm_ValidatingItem(object sender, System.ComponentModel.CancelEventArgs e)
        {
            foreach (ValidationSummaryItem item in dfEditForm.ValidationSummary.Errors)
            {
                if (item.Sources.Where(W => W.PropertyName != "myIgnoredPropertyName").Count() > 0)
                    e.Cancel = true;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多