MVP模式中的用户输入验证

时间:2014-06-15 04:36:20

标签: c# .net winforms validation mvp

我想在进入处理之前验证用户提供的详细信息。 我的UI主要有文本框,Combos。在某些字段中,用户必须提供数据,在某些字段中,只有某些类型的数据可能会被接受,如文本,日期/时间,数字等。当涉及到日期/时间时,我们应该检查提供的值是否在有效范围内

我的问题是

Q1。在MVP模式中哪里进行验证?

我的选择是

  1. 将验证实施为演示者可用的服务。 (通过DI,例如)
  2. 在像KeyPress这样的事件中在UI中进行验证。
  3. Presenter本身处理验证。
  4. Q2。如何进行验证。

    我的选择是

    我。视图中的所有控制器(如文本框)都封装在属性(Getters / Setters)

    public string Age
    {
        get { return txtAge.Text; }
        set { txtAge.Text = value; }
    }
    

    II。 UI触发事件验证(发件人,e)

    III。 Presenter侦听并将其连接到处理程序,然后处理程序调用Validate()方法

    IV。在Validate()方法中,它会检测控制器引发事件(发送者)并读取相应的属性以获取控制器中的值。

    诉然后它将根据模型中的类型检查类型并确定有效性,然后提醒用户

    这里的问题是我可能必须通过字符串属性公开所有控制器,否则当用户输入无效类型时它会给出异常。

    如果我这样做

        public int Age
        {
            get { return Convert.ToInt32(txtAge.Text); }
            set { txtAge.Text = Convert.ToString(value); }
        }
    

    然后问题是演示者无法进行验证,因为它已经转换为int?

1 个答案:

答案 0 :(得分:3)

  

在MVP模式中进行验证

     
      
  1. 将验证实施为演示者可用的服务。 (通过DI,例如)
  2.   
  3. 在像KeyPress这样的事件中在UI中进行验证。
  4.   
  5. Presenter本身处理验证。
  6.   

这取决于 - 没有"一种尺寸适合所有",您必须为每种验证做出决定。

考虑如果您使用不同的UI技术更改View图层会发生什么。即使您只使用一种UI,这种心理模型也有助于做出正确的决定。如果验证可以在演示者中完成,则它们可用于各种视图,而无需重新实现它们。另一方面,在presenter层中对特定UI的可用事件做出太多假设是不明智的。

因此,作为一般规则:将验证放入依赖于特定UI的视图中(例如,直接验证每个" KeyPress"是视图中验证的典型候选者)。在演示者中放置对每个不同的视图层都相同的验证(类型检查是边缘情况,见下文)。如果您有可能在不同演示者之间重用的验证代码,请将该代码放入帮助程序类或服务中。如果这必须是由" DI"提供的服务。主要取决于它是一个非常复杂的验证,需要访问数据库或类似的东西。

  

Q2。如何进行验证。     [如果是类型转换]

实际上,如果可能的话,通过限制用户可以在UI级别输入的内容,避免在演示者级别进行类型检查的必要性。如果数据与某种类型不匹配,大多数现代UI(桌面和Web)都提供机制以禁止输入数据。例如,使用特定的编号字段。如果特定UI技术中没有这样的东西,您仍然可以仅在UI级别为每个编辑字段实现类型验证机制,而不涉及演示者。所以我认为最好在View级别处理。

当然,在演示者级别可以更好地处理类似类型的验证(如范围检查),因为无论您使用View实现,测试都将始终相同。因此,他们更适合演示者级别。但是,范围检查不会为您提供问题中给出的类型转换问题。