2012-08-09 77 views
2

我曾在ASP.net MVC工作了1.5年。我在哪里使用企业应用程序块进行服务器端验证。我喜欢视图模型与视图控件和验证以这种方式工作的方式绑定的方式。但是现在我正在一个完全没有MVC的webforms的项目中工作。ASP .net验证技术

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

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

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

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

回答

1

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

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

我还没有与企业库合作过,所以我无法回答它提供的任何验证例程。

1

你可以使用CustomValidators做任何事情,它们是我的最爱!

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

您可以利用它们还可以像这样执行服务器端验证:

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