ASP.net验证技术

ASP.net验证技术,asp.net,.net,validation,webforms,Asp.net,.net,Validation,Webforms,我在ASP.NETMVC工作了1.5年。在这里,我使用企业应用程序块进行服务器端验证。我喜欢viewmodels绑定到视图控件的方式,并喜欢以这种方式进行验证。但是现在我在一个项目中工作,这个项目纯粹是没有MVC的webforms 这里jQuery用于客户端验证,而根本没有服务器端验证。我强调了服务器端验证的重要性,并计划使用企业库进行验证 由于某些原因(可能是因为我最近在ASP.NETMVC中工作),我在某一点上感到自大 在我的webforms应用程序中,我的验证必须包含客户端和服务器端的相同

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

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

由于某些原因(可能是因为我最近在ASP.NETMVC中工作),我在某一点上感到自大

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


我想遵循普遍接受的做法。此外,webforms验证中还有比企业库更好的新概念。示例应该有助于我理解。

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

使用触发ServerValidate事件的自定义验证器控件实现服务器端验证非常简单


我没有使用过企业库,因此我无法回答有关它提供的验证例程的任何问题。

您可以使用CustomValidator进行任何操作,它们是我的最爱

如果您使用HTML5属性,如
required=“required”
,您可以免费获得客户端反馈

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


代码隐藏功能:

私有void buildRequiredWebControl(列表lst,控件c)
{
如果(c是网络控制)
if(String.Compare((c作为网络控制).Attributes[“required”]?String.Empty,“required”,true)=0)
添加((c作为网络控制));
foreach(c.Controls中的控制ch)
构建所需网络控制(lst、ch);
}
/* --------------------------------------------- */
需要专用布尔addAllFields(列表控件)
{
foreach(网络控制,带控制)
{
如果(w作为文本框!=null)
if(String.IsNullOrWhiteSpace((w as TextBox.Text))返回false;
if(w作为DropDownList!=null)
if(String.IsNullOrWhiteSpace((w作为DropDownList.SelectedValue))返回false;
}
返回true;
}
/* --------------------------------------------- */
私有void cmdSubmit\u单击(对象发送方,事件参数e)
{
vSummary.ValidationGroup=“StackOverflow”;
第页:验证(“StackOverflow”);
List requiredFields=新列表();
this.buildRequiredWebControl(requiredFields,this);
Page.Validators.Add(新的CustomValidator()
{
IsValid=此.addAllFieldsRequired(requiredFields),
ErrorMessage=“请填写所有必填字段。”,
ValidationGroup=“StackOverflow”
});
如果(第页有效)
{
//在必填字段上继续很好
}
}
击败了非常单调的替代方法,即在每个控件之后手动将它们插入html:


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
    }
}
<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" />