ASP .net验证技术

时间:2012-08-09 16:22:58

标签: asp.net .net validation webforms

我在ASP.net MVC工作了1.5年。我在哪里使用企业应用程序块进行服务器端验证。我喜欢viewmodels以这种方式绑定到视图控件和验证的方式。但现在我正在开展一个纯粹没有MVC的webforms的项目。

这里jQuery用于客户端验证,根本没有服务器端验证。我强调服务器端验证的重要性,并计划使用企业库。

由于某些原因(可能是由于我最近在ASP.NET MVC中工作的事实),我在某一点上陷入困​​境。

在我的webforms应用程序中,我的验证必须包含客户端和服务器端的相同逻辑。或者一般来说,ASP .net Web表单中编码验证的最佳实践是什么?

我想遵循广泛接受的做法。对于webforms验证,还有哪些新概念比企业库更好。样本应该帮助我理解。

2 个答案:

答案 0 :(得分:1)

我认为你想要验证更多而不是更少......除了客户端检查之外,服务器端检查是一个好主意(特别是对于面向外部的应用程序)。您希望对文本框特别小心。请记住,用户可以关闭脚本(并完全绕过客户端脚本)。

使用激活ServerValidate事件的Custom Validator控件实现服务器端验证很容易。

我没有使用过企业库,所以我无法回答它提供的验证程序。

答案 1 :(得分:1)

你可以使用CustomValidators,它们是我的最爱!

如果您使用像required="required"这样的HTML5属性,则可以免费获得客户端反馈。

您也可以利用它们执行服务器端验证,如下所示:

<asp:ValidationSummary runat="server" id="vSummary" />

<asp:TextBox runat="server" id="txtReq" required="required" />
<asp:DropDownList runat="server" id="ddlReq" required="required">
    <asp:ListItem text="..." value="" />
    <asp:ListItem text="Yes" value="1" />
    <asp:ListItem text="No" value="0" />
</asp:DropDownList>

<asp:Button runat="server" id="cmdSubmit" text="Submit" />

功能背后的代码:

private void buildRequiredWebControls(List<WebControl> lst, Control c)
{
    if (c is WebControl)
        if (String.Compare((c as WebControl).Attributes["required"] ?? String.Empty, "required", true) == 0)
            lst.Add((c as WebControl));

    foreach (Control ch in c.Controls)
        buildRequiredWebControls(lst, ch);
}

/* --------------------------------------------- */

private Boolean addAllFieldsRequired(List<WebControl> controls)
{
    foreach (WebControl w in controls)
    {
        if (w as TextBox != null)
            if (String.IsNullOrWhiteSpace((w as TextBox).Text)) return false;

        if (w as DropDownList != null)
            if (String.IsNullOrWhiteSpace((w as DropDownList).SelectedValue)) return false;
    }
    return true;
}

/* --------------------------------------------- */

private void cmdSubmit_Click(object sender, EventArgs e)
{
    vSummary.ValidationGroup = "StackOverflow";
    Page.Validate("StackOverflow");

    List<WebControl> requiredFields = new List<WebControl>();
    this.buildRequiredWebControls(requiredFields, this);

    Page.Validators.Add(new CustomValidator()
    {
        IsValid = this.addAllFieldsRequired(requiredFields),
        ErrorMessage = "Please complete all required fields.",
        ValidationGroup = "StackOverflow"
    });

    if (Page.IsValid)
    {
        //Good to Go on Required Fields
    }
}

击败非常单调的替代方案,即在每次控制后手动将它们插入到html中:

<asp:ValidationSummary runat="server" id="vSummary" ValidationGroup="StackOverflow" />

<asp:TextBox runat="server" id="txtReq" required="required" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtReq" ErrorMessage="Please Fill Out Required Field" Text="*" ValidationGroup="StackOverflow" />

<asp:DropDownList runat="server" id="ddlReq" required="required">
    <asp:ListItem text="..." value="" />
    <asp:ListItem text="Yes" value="1" />
    <asp:ListItem text="No" value="0" />
</asp:DropDownList>
<asp:RequiredFieldValidator runat="server" ControlToValidate="ddlReq" ErrorMessage="Please Fill Out Required Field" Text="*" ValidationGroup="StackOverflow" />

<asp:Button runat="server" id="cmdSubmit" text="Submit" />