【发布时间】:2012-11-25 14:16:30
【问题描述】:
我有以下带有RequiredFieldValidator 的代码。 EnableClientScript 属性在验证控件中设置为“false”。我也禁用了浏览器中的脚本。
我没有在后面的代码中使用Page.IsValid。尽管如此,当我在文本框中没有任何值提交时,我会得到error message。
从@Dai 的 cmets,我知道这可能是一个问题,如果 Page_Load 中有任何代码在 postback 中执行。不会引发验证错误。
(但是,对于按钮点击处理程序,无需检查Page.IsValid)
if (Page.IsPostBack)
{
string value = txtEmpName.Text;
txtEmpName.Text = value + "Appended";
}
问题
- 为什么在
Page_Load之前不进行服务器端验证? - 为什么我使用
Page.IsValid时它工作正常? - 您能否提供对解释此问题的文章的任何参考? (不是说什么 - 总是使用
Page.IsValid;而是说什么是必须使用Page.IsValid
更新 1
参考ASP.NET Validators Common Misconception
Page.IsValid只有在运行Page.Validate()方法后才能访问,该方法在Page_Load之后的某处被隐式调用。如果您将所有逻辑保存在 Page_Load 事件处理程序中(强烈建议不要这样做!),请在检查Page.IsValid之前调用Page.Validate()。
注意:建议不要保留Page_Load 中的所有逻辑。如果按钮单击事件发生某些事情,请将其移至按钮单击事件处理程序。如果在下拉事件中发生某些事情,请将其移动到下拉选定项更改事件处理程序。
更新 2
看起来,如果我们使用带有服务器端验证的Custom Validator,我们也需要在button click 中添加If(Page.IsValid)。参考CustomValidator not working well。
注意:此处存在客户端验证问题:Whether to use Page_IsValid or Page_ClientValidate() (for Client Side Events)
标记
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
alert('haiii');
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ValidationSummary runat="server" ID="vsumAll" DisplayMode="BulletList" CssClass="validationsummary" ValidationGroup="ButtonClick" />
<asp:TextBox ID="txtEmpName" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="valEmpName" runat="server" ControlToValidate="txtEmpName"
EnableClientScript="false" ErrorMessage="RequiredFieldValidator" Text="*" Display="Dynamic"
ValidationGroup="ButtonClick"></asp:RequiredFieldValidator>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" ValidationGroup="ButtonClick" />
</div>
</form>
</body>
</html>
代码隐藏
protected void Button1_Click(object sender, EventArgs e)
{
string value = txtEmpName.Text;
SubmitEmployee(value);
}
参考文献:
【问题讨论】:
-
@MassimilianoPeluso 这个问题很相似,但没有解决相同的问题。它说“即使页面上没有验证控件也调用 Page.IsValid ”。但我的页面中有验证控件
-
您需要向我们展示您的代码隐藏逻辑。根据您编写代码的方式,可能需要也可能不需要检查
IsValid。例如,如果您的逻辑位于仅在页面有效时调用的按钮单击处理程序中,则IsValid检查在幕后完成,但如果您的逻辑位于由if( IsPostback ); Validate(); if( IsValid )保护的Page_Load中那么您确实需要检查该属性。 -
您能否评论一下我需要澄清什么才能完全回答您的问题?我认为提供的答案涵盖了您的问题,但也许需要澄清一下?
-
没有什么时候使用
Page.IsValid的强制场景——你的逻辑表明了这一点,正如我在回答中所逃避的那样。唯一强制的操作顺序是在询问Page.IsValid之前必须调用Page.Validate(由您或在回发期间由控件指示)。如果您的逻辑要求页面有效才能继续,您只需检查Page.IsValid。话虽这么说,你永远不应该依赖一个不触发的事件,如果它是无效的,并且永远不要假设“如果我到达这里,页面必须是有效的。”
标签: asp.net validation