如何在所有视图中使用中央处理程序进行所有输入验证

时间:2014-06-30 18:13:34

标签: c# .net winforms validation mvp

在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使用吗?

注意:我的视图无法识别ModelPresenter。调用Presenter&#39; ShowView()方法向用户显示View。我无法在Presenter中进行此验证,因为演示者会访问ViewIView'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时,这将导致视图中出现异常。

请注意,这个解释完全基于我对此事的理解,如果我错过任何事情,请告诉我。

1 个答案:

答案 0 :(得分:2)

您可以保留int,而不是在查看界面中保留string属性。这样,当您获得用户的输入时,将无法抛出异常,因为代码隐藏中不会进行解析。然后,您将在 Presenter 中进行解析。通过这样做,您可以拥有一个集中的位置来验证输入。

查看的工作是仅向演示者提供用户输入,以便不对其进行验证。

如果您必须在很多地方进行相同的验证,请遵循我的建议,您可以创建其他演示者继承的基础演示者类并将其放入在那里验证。它肯定比制作其他形式继承的基础Form更容易。