我想在进入处理之前验证用户提供的详细信息。 我的UI主要有文本框,Combos。在某些字段中,用户必须提供数据,在某些字段中,只有某些类型的数据可能会被接受,如文本,日期/时间,数字等。当涉及到日期/时间时,我们应该检查提供的值是否在有效范围内
我的问题是
Q1。在MVP模式中哪里进行验证?
我的选择是
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?
答案 0 :(得分:3)
在MVP模式中进行验证
- 将验证实施为演示者可用的服务。 (通过DI,例如)
- 在像KeyPress这样的事件中在UI中进行验证。
- Presenter本身处理验证。
醇>
这取决于 - 没有"一种尺寸适合所有",您必须为每种验证做出决定。
考虑如果您使用不同的UI技术更改View图层会发生什么。即使您只使用一种UI,这种心理模型也有助于做出正确的决定。如果验证可以在演示者中完成,则它们可用于各种视图,而无需重新实现它们。另一方面,在presenter层中对特定UI的可用事件做出太多假设是不明智的。
因此,作为一般规则:将验证放入依赖于特定UI的视图中(例如,直接验证每个" KeyPress"是视图中验证的典型候选者)。在演示者中放置对每个不同的视图层都相同的验证(类型检查是边缘情况,见下文)。如果您有可能在不同演示者之间重用的验证代码,请将该代码放入帮助程序类或服务中。如果这必须是由" DI"提供的服务。主要取决于它是一个非常复杂的验证,需要访问数据库或类似的东西。
Q2。如何进行验证。 [如果是类型转换]
实际上,如果可能的话,通过限制用户可以在UI级别输入的内容,避免在演示者级别进行类型检查的必要性。如果数据与某种类型不匹配,大多数现代UI(桌面和Web)都提供机制以禁止输入数据。例如,使用特定的编号字段。如果特定UI技术中没有这样的东西,您仍然可以仅在UI级别为每个编辑字段实现类型验证机制,而不涉及演示者。所以我认为最好在View级别处理。
当然,在演示者级别可以更好地处理类似类型的验证(如范围检查),因为无论您使用View实现,测试都将始终相同。因此,他们更适合演示者级别。但是,范围检查不会为您提供问题中给出的类型转换问题。