我知道永远不要相信用户输入,因为不良输入可能会以某种方式损害应用程序的完整性,无论是偶然的还是有意的; 但是,即使页面上没有验证控件,也有一种调用Page.IsValid的情况(同样,我知道通过省略验证来信任用户输入的不良做法)?Page.IsValid是否执行任何其他类型的验证?我查看了MSDN,文档似乎表明只有在页面上有验证控件或者调用了Page.Validate方法时,Page.IsValid才有效.我的一个朋友建议我每次都在按钮单击处理程序中检查Page.IsValid,即使没有验证控件或显式的Page.Validate调用.
我有以下几片asp:
<asp:ValidationSummary ID="RegisterUserValidationSummary" runat="server" CssClass="failureNotification"
ValidationGroup="RegisterUserValidationGroup"/>
Run Code Online (Sandbox Code Playgroud)
...
<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserNameTB">Username:</asp:Label>
<asp:TextBox ID="UserNameTB" runat="server" CssClass="textEntry"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="UserNameTB"
ValidationExpression="[a-zA-Z]{3,8}" ErrorMessage="Username must be between 3 to 8 chars" runat="server"
CssClass="failureNotification" ToolTip="Username must be between 3 to 8 chars" ValidationGroup="RegisterUserValidationGroup">
*</asp:RegularExpressionValidator>
<asp:CustomValidator ID="NoUserValidator" ControlToValidate="UsernameTB" runat="server" ErrorMessage="User Taken!" CssClass="failureNotification"
ValidationGroup="RegisterUserValidationGroup" OnServerValidate="UserValidate">*</asp:CustomValidator>
Run Code Online (Sandbox Code Playgroud)
然后功能:
protected void UserValidate(object source, ServerValidateEventArgs args)
{
SqlDataSource1.SelectCommand = "SELECT ClientID FROM [Clients] WHERE Username= '" + UserNameTB.Text + "'";
DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
if (dv.Table.Rows.Count != 0)
args.IsValid = false; …Run Code Online (Sandbox Code Playgroud) 我在按钮单击处理程序中有以下代码.这两种方法都很好.将Page_ClientValidate()导致一个额外的验证检查,并做处理而Page_IsValid利用现有的财产.
质询
Page_IsValid在那个时间计算?如果不能保证,我们需要Page_ClientValidate()明确调用.Page_IsValid设定之前发生的事件是什么?对于此类事件,我们不应该依赖Page_IsValidUPDATE
是否确保仅在验证部分完成后调用按钮单击事件处理程序(在JavaScript中)(即,在作为验证的一部分调用Page_ClientValidate()之后)?如果可以肯定,我可以依赖Page_IsValid吗?
脚本
$('#btnSave').click(function (e) {
//Aproach 1
var isValid = Page_ClientValidate('');
if (isValid)
{
//Do reamining work
}
//Aproach 2
if (Page_IsValid)
{
//Do reamining work
}
});
Run Code Online (Sandbox Code Playgroud)
参考文献:
我经常从学校的“讲师”那里得到不正确的信息。
对于 ASP.NET Web 应用程序,工具箱中的验证器(如 CompareValidator、RangeValidator、RequiredFieldValidator 等)是否被视为服务器端验证?
因为我们还添加了一个 jQuery NuGet 包,它在用户选项卡时提供实时验证,就像用户在需要数字时键入字母一样。
对于 C# 中的 WPF,我创建了一个验证器类或使用一个库并通过静态方法以这种方式检查验证。我也应该在 ASP.NET 中这样做吗?或者 RequiredFieldValidators 等是否足以进行服务器端验证?
下面是一个例子:
<div class="form-group">
<label class="control-label col-sm-4">Length:</label>
<div class="col-sm-4">
<asp:TextBox ID="txtLength" runat="server" CssClass="form-control" MaxLength="15"></asp:TextBox>
</div>
<div class="col-sm-4">
<asp:RequiredFieldValidator ID="rfvLength" runat="server" ErrorMessage="Length is required"
ControlToValidate="txtLength" CssClass="error" Display="Dynamic" SetFocusOnError="True"></asp:RequiredFieldValidator>
<asp:RangeValidator ID="rngLength" runat="server" ErrorMessage="Must be between .01 and 10,000"
MaximumValue="10000" MinimumValue=".01" ControlToValidate="txtLength" CssClass="error" Display="Dynamic"
SetFocusOnError="True" Type="Double"></asp:RangeValidator>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
谢谢
******编辑*****
伙计们,你们给出的答案不清楚或不完整,就像我的“导师”一样。
请是或否,这是 ASP.NET 中的服务器端验证吗?
<div class="form-group">
<label class="control-label col-sm-4">Length:</label>
<div class="col-sm-4">
<asp:TextBox ID="txtLength" runat="server" CssClass="form-control" …Run Code Online (Sandbox Code Playgroud)