我在ASP.net MVC工作了1.5年。我在哪里使用企业应用程序块进行服务器端验证。我喜欢viewmodels以这种方式绑定到视图控件和验证的方式。但现在我正在开展一个纯粹没有MVC的webforms的项目。
这里jQuery用于客户端验证,根本没有服务器端验证。我强调服务器端验证的重要性,并计划使用企业库。
由于某些原因(可能是由于我最近在ASP.NET MVC中工作的事实),我在某一点上陷入困境。
在我的webforms应用程序中,我的验证必须包含客户端和服务器端的相同逻辑。或者一般来说,ASP .net Web表单中编码验证的最佳实践是什么?
我想遵循广泛接受的做法。对于webforms验证,还有哪些新概念比企业库更好。样本应该帮助我理解。
答案 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" />