验证相对复杂的设计问题

时间:2009-11-07 18:33:53

标签: c# user-interface design-patterns validation

我有一个设计问题..似乎我给你太多细节,但这些很重要。

说我有一个非常大的输入形式,输入复杂,需要安静复杂的验证,包括不同输入之间关系的验证。对于用户而言,这可能是一种非常繁重的形式,我想给他最终的体验,我真的不想受到编程困难的限制。 我认为理想的每个控件在开始时应该有一个空值,当然除了那些有默认值(问题是DateTimePicker,这样不支持空值)。

现在用户可以按照他想要的任何顺序填写任何控件。一旦他离开控制,程序将验证控件的值,以及与该控件有关的任何其他验证,以及其他非空的控件(已经提交)

如果存在任何验证错误,控件将以某种颜色绘制,并且在某些侧面板中它将指定错误(当然,用户友好的语言,而不是异常的描述)。

如果存在与多个控件有关的错误,则仅绘制已更改的最后一个控件。

我真的很想在这里保留尽可能多的OOP概念..

所以我有我的逻辑类,它正在处理计算输出和类似的东西。显然那些与gui无关。现在所有这些复杂的验证也应该在逻辑类的属性等中,但也应该在gui中使用,所以我认为应该有类似静态验证方法(在逻辑类中),将用于gui,在逻辑课上他们自己。

问题是,一个逻辑类可能包含多达20个30个字段来验证...静态方法需要30个参数吗?是没关系还是有更多可接受的解决方案?

我对此之外的任何事情都有点迷失..但我很确定已经有一些针对这些情况的约定......我知道它与设计模式有关,但我不知道是什么设计有处理这种情况的模式,我应该在哪里阅读它们。

我的问题基本上是如何以最好的方式整合逻辑类和gui的验证。

如果我已经在那里,我不想为这些打开一个新问题:

正如我所提到的,我需要一个方法,它获取所有输入,类的所有字段,并以某种方式对非空值执行所有验证检查(如果存在与a有关的验证检查几个参数,甚至其中一个为null,验证不应执行)。如果你有任何有趣的想法,我想听听。

我碰到的另一个问题是,非空的控件,比如DateTimePicker ....它真的很丑,它会有一定的价值,而它不应该......你不觉得吗?

P.S。

对不起我的英语..我太累了,写不出来..

使用Windows

EDIT1

3 个答案:

答案 0 :(得分:2)

  

静态方法需要30   参数Δ

是的,但如果您将对象单独传递给静态验证方法而不是其所有属性,那该怎么办呢

public static class YourClassRules
{
    public List<SomeSortOfValidationItem> Validate(YourClass obj)
    {
        var results = new List<SomeSortOfValidationItem>()

        if (obj.YourProperty.Length >= 200)
        {
           results.Add(new SormSortOfValidationItem("YourProperty", "Length must be less than...");
        }
        //etc.
    }

}
  

我的问题基本上是我怎么做的   整合逻辑验证   班级和gui,在最好的   方式。

有几种不同的框架可供使用。知道你的窗户或网络是否有用会很有帮助。然后我们可以做一些推荐。

  

我遇到的另一个问题是,   非空的控件,例如   的DateTimePicker。

您是否遇到控件或绑定到控件的属性的问题。我经常使用DateTime?或Nullable,它将允许空值。

希望这有帮助。

答案 1 :(得分:0)

DataAnnotations可以非常容易实施并且非常有效。阅读this answer以获得可以进一步扩展的替代方案。此外,this question也有一些关于验证模型的宝石。

答案 2 :(得分:0)

Spring有一个非常好的DataBinding和验证API。由于有一个Spring.NET版本,我建议你去研究它。