Asp.net Page.IsValid如何工作?
我有以下带有Asp.net Page.IsValid如何工作?,asp.net,validation,Asp.net,Validation,我有以下带有RequiredFieldValidator的代码。验证控件中的EnableClientScript属性设置为“false”。我还禁用了浏览器中的脚本 我没有使用Page.IsValid中的代码隐藏。不过,当我在文本框中没有任何值的情况下提交时,我会收到错误消息 从@Dai的评论中,我了解到,如果页面加载中有任何代码在回发中执行,这可能是一个问题。不会抛出任何验证错误 (但是,对于按钮单击处理程序,不需要检查页面。是否有效) 问题 为什么服务器端验证不在加载页面之前进行 为什么我使用
RequiredFieldValidator
的代码。验证控件中的EnableClientScript
属性设置为“false”。我还禁用了浏览器中的脚本
我没有使用Page.IsValid
中的代码隐藏。不过,当我在文本框中没有任何值的情况下提交时,我会收到错误消息
从@Dai的评论中,我了解到,如果页面加载
中有任何代码在回发
中执行,这可能是一个问题。不会抛出任何验证错误
(但是,对于按钮单击处理程序,不需要检查页面。是否有效
)
问题
Page.IsValid
时它工作正常Page.IsValid
;而是说必须使用Page.IsValid
Page.IsValid
只有在运行Page.Validate()
方法后才可访问,该方法在Page\u Load
之后的某处隐式调用。如果将所有逻辑保留在Page\u Load事件处理程序中(这是非常不推荐的!),请调用Page.Validate()
在检查页面之前。是否有效
注意:建议不要保留加载页面中的所有逻辑。如果按钮单击事件发生,请将其移动到按钮单击事件处理程序。如果下拉事件发生,请将其移动到下拉所选项目更改事件处理程序
更新2
似乎,如果(Page.IsValid)在按钮中单击也需要添加If(Page.IsValid)
如果我们使用的是带有服务器端验证的自定义验证器
。请参阅
注意:此处存在客户端验证问题:
标记
<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>
参考资料:
验证发生在页面加载之后,但在事件处理程序之前(请参阅)
如果您的按钮未导致验证,则必须手动启动Page.Validate.
在(1)调用Page.Validate
或(2)导致验证的控件是回发的源/包含在回发中之前,您不能询问Page.IsValid
如果要求在事件处理程序启动之前进行验证,则可以使用:
if (Page.IsPostback)
{
Page.Validate( /*Control Validation Group Name Optional*/ );
if (Page.IsValid)
{
//Do some cool stuff
}
}
你也可以考虑重新设计,这样你就不需要这样做了。
在处理导致验证的控件的事件处理程序中,
Page.IsValid
保证可用。在所有其他情况下,重新请求验证通常更安全。在具有验证程序的表单上处理提交的一种模型:
void btnSubmit_Click(object sender, EventArgs e)
{
this.UpdateGUIWithSubmitRequest();
if (Page.IsValid)
{
this.ProcessSuccessfulSubmission();
}
else
{
this.ProcessInvalidSubmission();
}
}
如果您使用的是 CualValualUs>/Cuff>,它有一个非常昂贵的验证步骤,您可以考虑将结果缓存在HythPrimys.Cache < /Cord>中,因此如果多次调用PAGE,则不必重新验证。
void CustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
CustomValidator self = (CustomValidator)source;
string validatorResultKey = self.ClientID;
bool? validatorResult = Context.Items[validatorResultKey] as bool?;
if (validatorResult.HasValue)
{
args.IsValid = validatorResult.Value;
return;
}
bool isValid = this.DoSomethingVeryTimeConsumingOrExpensive();
Context.Items[validatorResultKey] = isValid;
args.IsValid = isValid;
}
当然,这100%取决于您的体系结构,以及您是否能够假设初始验证期间通过/失败的验证在同一页面生命周期的后续验证期间仍然通过/失败。提交按钮应具有与验证程序控件相同的验证组。例如
<asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />
@MassimilianoPeluso这个问题很相似,但不是针对同一个问题。它说“调用Page.IsValid,即使页面上没有验证控件”。但是我的页面中有验证控件。您需要向我们显示您的代码隐藏逻辑。根据您编写代码的方式,可能需要检查IsValid
。例如,如果您的逻辑位于一个按钮单击处理程序中,该处理程序仅在页面有效时才会调用,则IsValid
检查将在后台完成s、 但是如果您的逻辑在Page_Load
中,由if(IsPostback);Validate();if(IsValid)
保护,那么您确实需要检查属性。您能否评论一下我需要澄清什么才能完全回答您的问题?我认为提供的答案涵盖了您的问题,但可能有什么需要澄清?对于何时使用Page.IsValid
——您的逻辑规定了这一点,正如我在回答中回避的那样。唯一的强制操作顺序是必须调用Page.Validate
(由您或在回发过程中由控件指定)在询问Page.IsValid
之前。如果您的逻辑要求页面有效才能继续,则只需检查Page.IsValid
。也就是说,如果事件无效,则决不能依赖未触发的事件,也决不能假设“如果我到达这里,页面必须有效。”当您说“如果您的按钮未导致验证”时,您的意思是CausesValidation=“false”吗"?是的,但是有一个警告。如果原因验证是错误的但是使用提交行为是正确的,我相当肯定仍然会发生一些验证。我现在找不到任何关于它的好参考,但我相信我遇到了这样的情况。也许有人可以评论一下确实如此。如果您只想在有效页面上执行操作,您只需检查页面。IsValid
。在一些非常实际的用例中,您可能希望在100%的时间内单击一次,如果所有验证程序都通过了,则需要执行其他操作。我将对我的答案进行一点扩展,以供参考。如果客户端用户有Java如果禁用了脚本,将页面。是否有效
也会在服务器上工作?是的,服务器端有效性检查会在不考虑javascript的情况下完成。javascript
void CustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
CustomValidator self = (CustomValidator)source;
string validatorResultKey = self.ClientID;
bool? validatorResult = Context.Items[validatorResultKey] as bool?;
if (validatorResult.HasValue)
{
args.IsValid = validatorResult.Value;
return;
}
bool isValid = this.DoSomethingVeryTimeConsumingOrExpensive();
Context.Items[validatorResultKey] = isValid;
args.IsValid = isValid;
}
<asp:Button Text=" Submit " runat="server" ID="btnSubmit" OnClick="btnSubmit_Click" ValidationGroup="vgCustomerValidation" />