通过属性实现验证的基本问题?请指导我

时间:2010-06-08 07:27:51

标签: c# asp.net validation fluentvalidation fluentvalidation-2.0

感谢您的关注和时间。

我想在物业的解决方案中实施验证。这是一个需要您的专业帮助的问题。

我知道在设置值之前我将如何进行验证。但如果传递的值不正确则无法做什么。只是不设置不是一个可接受的解决方案,因为我想向用户返回一个适当的消息(在Web表单的标签中)。我的示例代码是:

private  int id;
public int Id
{
    get
    { return id; }

    set
    {
        bool result = IsNumber(value);
        if (result==false)
        {
            // What to do if passed data is not valid ? how to give a appropriate message to user that what is wrong ?
        }

        id = value;
    }
}

一个想法是使用return但不允许。

投掷错误看起来不太好,因为我们通常会避免自定义错误。

请指导和帮助我。

感谢期待

haansi

4 个答案:

答案 0 :(得分:1)

我认为你最好换另一个例子,因为:

public int Id
{
  get { ... }
  set 
  { 
      if (!IsNumer(value)) // changes to if (value>5)
      {
            //the code here will never be executed
           id = value;
      }
  }
}

答案 1 :(得分:1)

您可以考虑从属性设置器中抛出适当的异常。这样,主叫方会明白出了什么问题,特别是假设您有关于设置属性的业务规则。当然你确实希望调用者进行验证,如果仍有问题,那么抛出异常似乎并不那么糟糕。

“从属性设置器中抛出异常是有效且可接受的。” Property design guidelines

Best practices: throwing exceptions from properties

What exception to throw from a property setter?

答案 2 :(得分:0)

  1. 如果检查只是数字(类型),那么您的财产可以很好地处理类型安全。例如。用户无法将字符串分配给接受int的属性。

  2. 我建议如果Property涉及certaing计算,那么应该考虑使用一种方法。在这种情况下,您可以选择获得一些文本作为回报。

  3. 还有一个选项是将所有这些验证检查存储在实例集合中(在同一对象内)。等。

    私人名单_faileValdations;

  4. //更多代码

        set
        {
        if (!IsNumber(value))
        {
        _faileValdations.Add("Invalid value for xxx. Expected... got..");
        }
        else{
            id = value;
        }
        }
    

    然后,您的GUI最终可以读取FailedValidations集合,并在某个标签中以格式化方式显示它。

    编辑:下面还有一个选项。

    1. 对不起,我以前忘了提这个。
    2. 您也可以使用事件驱动方法。 对象可以公开类似“ValidationFailed”的事件,并且所有GUI对象都可以订阅此事件。如果setter中的任何验证失败,该对象将触发此事件。

          set {
          if (!IsNumber(value))
          {
          RaiseValidationFailed("some message");
          }
          else{
              id = value;
          }
          }
      

      “RaiseValidationFailed”可以收集消息,将其包装在某些事件args中并使用消息触发“ValidationFailed”事件。然后GUI可以对此作出反应。 {如果不清楚,我可以为您提供完整的代码}

答案 3 :(得分:0)

我认为你应该重新考虑你的验证方法。您建议的方法意味着每次属性更改时,都会生成一条消息。

如何收集,存储和呈现这些消息?特别是如果你决定在网站上使用你的课程?

如果您想在其他任何时间验证课程该怎么办?

如果您想在客户端验证中使用相同的规则,该怎么办?

我可以理解尽早捕获无效值的吸引力,但在一次调用中验证整个类(如Validate()方法)要容易得多。这样,您就可以完全控制验证逻辑的运行时间。

我建议您阅读有关属性验证的两种主要方法:

Data Anotations

Fluent Validation for >NET 3.0 and above

Fluent Validation for .NET 2.0

Data Annotations和FluentValidation都易于使用,并且能够在Web表单和win表单上生成经过良好测试的客户端验证。

在“数据注释”中,使用属性将验证添加到属性中。如果您希望将数据类保持为干净的数据传输对象,则Fluent验证涉及在Validator类中创建易于阅读的规则。