在MVP Winforms
应用程序中,我使用以下方法在View
中进行初始验证。 (尽管在Model
中完成了与业务逻辑相关的验证)。在使用Form's
循环的foreach
构造函数中,我将所有TextBoxe's
Validating
事件委派给此处理程序。
//Validates all text boxes in the form
private void textBox_Validating(object sender, CancelEventArgs e)
{
TextBox currenttb = (TextBox)sender;
{
if (string.IsNullOrWhiteSpace(currenttb.Text))
{
currenttb.BackColor = Color.OrangeRed;
currenttb.Name.Substring(3)));
}
else
{
e.Cancel = false;
currenttb.BackColor = Color.White;
}
}
}
public Form()
{
InitializeComponent();
//In form's constructor, following eventhanderlrs are hooked up to validating events of controllers,
//there for one controller type shares a single handler
foreach (TextBox tb in this.Controls.OfType<TextBox>().Where(x => x.CausesValidation))
{
tb.Validating += textBox_Validating;
}
}
不在每个View
重复此代码。如果我能将它保存在一个地方,它会更好。那么你能告诉我一个更好的方法来集中让它可供所有Views
使用吗?
注意:我的视图无法识别Model
和Presenter
。调用Presenter
&#39; ShowView()
方法向用户显示View
。我无法在Presenter
中进行此验证,因为演示者会访问View
到IView's
公共属性,因此甚至应在Presenter对这些属性执行操作之前进行验证。
修改
对于前。 IView具有类似
的属性void int ID {get; set;}
void string Name {get; set;}
等
如果演示者应该像
那样进行验证private void ValidateID()
{
try
{
Validate (_View.ID);
}
catch {}
}
那么如果用户将txtID.text
保持为空,会发生什么?当它尝试将null值转换为int时,这将导致视图中出现异常。
请注意,这个解释完全基于我对此事的理解,如果我错过任何事情,请告诉我。
答案 0 :(得分:2)
您可以保留int
,而不是在查看界面中保留string
属性。这样,当您获得用户的输入时,将无法抛出异常,因为代码隐藏中不会进行解析。然后,您将在 Presenter 中进行解析。通过这样做,您可以拥有一个集中的位置来验证输入。
查看的工作是仅向演示者提供用户输入,以便不对其进行验证。
如果您必须在很多地方进行相同的验证,请遵循我的建议,您可以创建其他演示者继承的基础演示者类并将其放入在那里验证。它肯定比制作其他形式继承的基础Form
更容易。