gpt4 book ai didi

asp.net - Page.IsValid 是如何工作的?

转载 作者:行者123 更新时间:2023-12-02 08:43:49 25 4
gpt4 key购买 nike

我有以下带有 RequiredFieldValidator 的代码。 EnableClientScript 属性在验证控件中设置为“false”。我还在浏览器中禁用了脚本。

我没有在后面的代码中使用Page.IsValid。不过,当我在文本框中没有任何值的情况下提交时,我会收到错误消息

从 @Dai 的评论中,我了解到,如果 Page_Load 中有任何代码在 postback 中执行,这可能是一个问题。不会抛出验证错误。

(但是,对于按钮单击处理程序,无需检查 Page.IsValid)

if (Page.IsPostBack)
{
string value = txtEmpName.Text;
txtEmpName.Text = value + "Appended";
}

问题

  1. 为什么服务器端验证不在 Page_Load 之前发生?
  2. 为什么我使用 Page.IsValid 时效果很好?
  3. 您能否提供解释此问题的文章引用资料? (不是说 - 总是使用 Page.IsValid;而是说什么是使用 Page.IsValid
  4. 的强制场景

更新1

引用ASP.NET Validators Common Misconception

Page.IsValid is accessible only after running Page.Validate() method which is invoked implicitly somewhere after Page_Load. In case you keep all of your logic in a Page_Load event handler (which is highly discouraged!), call the Page.Validate() before checking the Page.IsValid.

注意:建议不要保留Page_Load中的所有逻辑。如果按钮单击事件发生某些情况,请将其移至按钮单击事件处理程序。如果下拉事件发生某些情况,请将其移至下拉所选项目更改事件处理程序。

更新2

看起来,如果我们使用自定义验证器,我们还需要在按钮单击中添加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);
}

引用文献:

  1. Should I always call Page.IsValid?
  2. ASP.NET Validation Controls – Important Points, Tips and Tricks
  3. CustomValidator not working well

最佳答案

验证发生在 Page_Load 之后,但在事件处理程序之前(请参阅 http://msdn.microsoft.com/en-us/library/ms178472(v=VS.100).aspx )。

如果您的按钮不会引发验证,则必须手动触发 Page.Validate。

您不能询问 Page.IsValid,直到 (1) 您调用了 Page.Validate 或 (2) 导致验证的控件是/包含的源在回发中。

如果您需要在事件处理程序触发之前进行验证,您可以使用:

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();
}
}

如果您使用的 CustomValidator 具有非常昂贵的验证步骤,您可以考虑将结果缓存在 HttpResponse.Cache 中,这样您就不必重新验证是否发生多次调用 Page.Validate。

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.net - Page.IsValid 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13762467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com