有没有更好的方法来处理用户输入验证?

时间:2012-03-01 06:29:29

标签: c# asp.net validation input error-handling

我有一个3层的演示,逻辑和数据访问系统。在我的逻辑层中,我有一个Validate()方法,它确保即将转发到数据访问层的数据对数据库有效(没有空值,不允许空值,等等)。

最重要的是,在.aspx表示层中,我们有一些用户友好的错误检查和验证,直接检查Web表单上的控件。我的问题是后面的代码中的ValidateInput()方法检查控件,它是几百行长,真的很难维护。检查数据的代码远远长于实际工作的代码。

我得到的是这样的:

        private List<string> ValidateInput()
        {
           List<string> errormessages = new List<string>();

           if (LastNameETextBox.Text.Trim() == String.Empty)
           { 
              errormessages.Add("Last name required."); 
           }

           if (FirstNameETextBox.Text.Trim() == String.Empty)
           { 
              errormessages.Add("First name required."); 
           }

           //etc. etc.
        }

我们在母版页中隐藏了一个很好的样式通知框,当我们调用它时,它会从Visible false变为true,从而创建一个覆盖框的“错觉”。它看起来非常好,工作得很好所以我们想要使用它。我们的想法是,我们收集整个表单的所有错误,将它们放在一个列表中,然后将该列表发送到通知框,然后通过一个不错的列表给出所有错误。

但是Validate()只是一大堆“if”语句而且很难跟踪。这只是输入验证的本质,还是有其他更好的方法来处理它?<​​/ p>

3 个答案:

答案 0 :(得分:4)

我认为您可以避免使用Generic函数使用这些类型的If语句。 我的建议是定义一个像这样的函数

private List<string> ValidateInput(string ErrorMessage, TextBox txtInput, ValidatationType validationType)
{
    List<string> errormessages = new List<string>();


    if (validatationType  == ValidationType.NoNullValues)
    { 

        if (txtInput.Text.Equals(String.Empty))
            {
                errormessages.Add(ErrorMessage); 
            }

    }

    if (validatationType  == ValidationType.Integer)
    { 

        int number;
        if (Int32.TryParse(value, out number))
        {
            errormessages.Add(ErrorMessage); 
        }

    }

    // etc. etc.
}

Enum ValidationType

enum ValidationType
{
    NoNullValues,
    Integer,
    // etc
}

请修改功能。还检查语法,我使用记事本编写代码。 如果您在单独的类中使用所有验证方法,此方法还可帮助您实现可重用性。

由于

答案 1 :(得分:0)

我处理它的几种不同方式(在不同的项目中):

  1. 使用自定义控件库 - 控件只是扩展现有的ASP.NET / 3方控件,以添加由IsMandatory,MandatoryMessage等属性控制的验证逻辑。属性通常在设计时设置(和没有视图状态支持)。验证逻辑将在基页公开的消息集合中累积错误消息。另一个变体使用了将ASP.NET控件和验证器结合起来的用户控件,但坦率地说,ASP.NET验证器很糟糕。

  2. 基本上,基页类具有验证逻辑,该逻辑将遍历页面中的控件集合,然后根据控件类型执行验证。该页面将提供一个注册表来注册控件以进行验证,验证类型和要显示的错误消息。还有一种取消注册/跳过控制验证的方法,主要用于跳过控制中的控制遍历,例如转发器/网格视图。

  3. 对于客户端(浏览器端)验证,我使用过jquery validation(或自己的JS库)。在上述两种情况下,验证逻辑还会发出必要的启动脚本来设置客户端验证 - 但是,#2可以生成单个启动脚本(具有较小的大小),而#1需要生成启动每个控件实例的-up脚本。从灵活性的角度来看,#1更好,非常适合基于控件的开发方法。 #2将验证逻辑集中在一个中心位置(即基页),这非常方便。

答案 2 :(得分:0)

a)创建验证类型枚举,以枚举您要执行的所有类型的验证。 (在你的代码中,你正在对两个控件进行字符串空检查,这两个控件都是文本框,它不必要地重复代码逻辑) b)创建一个包含所有错误消息的常量/或资源文件。 c)编写一个带有控件,验证类型枚举,验证参数和错误消息ID的函数。它将检查控件的类型并执行enum指示的验证。如果错误,则会在“errorMessages”集合中添加错误消息。

enum ValidationType{
    NullCheck,
    IsNumber,
    RangeCheck,
    ....
}

class ErrorMessages{
    const string FNEMPTY = "First Name is empty";
    ....
}

class BusinessObject{
    function ValidateControl(Control cntrl, ValidationType type, object[] args, string message)
    {
        if(cntrl is TextBox)
        {
             if(cntrl as TextBox).Text.Trim() == String.Empty
                  errorMessages.Add(message);
        }
        ...
    }
}

现在,您可以在要验证的每个控件上调用上述函数。另一个改进是为所有控件实现一个基类,该控件在属性(Dictionary<ValidationType,String>)中包含相应的错误消息集合。然后,您可以修改验证函数以接受ValidationType枚举数组,以在一次调用中执行多个验证。每个控件都会为我们在基类中创建的属性中的每个验证类型提供错误消息。

希望这有帮助。

由于 Ven