【问题标题】:RequiredFieldValidator error messages displayed after successful Postback and form reset成功回发和表单重置后显示的RequiredFieldValidator 错误消息
【发布时间】:2016-01-29 15:23:57
【问题描述】:

(使用 ASP.NET Web 窗体。Microsoft .NET Framework 版本:4.0.30319,ASP.NET 版本:4.0.30319.34274)

我有一个 asp:TextBox 字段,该字段带有RequiredFieldValidator:

<asp:TextBox 
    runat="server" 
    ID="MyTextBox" />
<asp:RequiredFieldValidator 
    runat="server"
    ID="RequiredUserName"
    ControlToValidate="MyTextBox" 
    ErrorMessage="MyTextBox is required"
    Display="None" />

当用户在页面上提交表单时,我会对其进行验证,然后清除表单,以便他们的用户可以再次使用该表单。 Page_Load 后面的代码如下:

if (Page.IsPostBack)
{
    Page.Validate();
    if (Page.IsValid)
    {
        SaveFormSubmissionToDatabase();
        MyTextBox.Text = "";
    }
}

所以,我验证了所有内容,Page.IsValid 为真,我保存了用户表单数据,然后尝试清除表单以供用户再次填写。但是由于表单被清除,RequiredFieldValid 会显示它的错误消息,即使我已经运行了Page.Validate() 并且没有再次运行它。

为什么会这样?我可以做些什么来避免在清除表单后显示此错误消息?更一般地说,为什么这个RequiredFieldValidator 会再次运行?

我应该注意到错误消息实际上显示在asp:ValidationSummary 控件中。

(我认为可能是客户端验证触发了正在显示的错误消息,所以我在RequiredFieldValidator 中设置了EnableClientScript="false",但这并没有改变任何东西)


我已经研究了这个问题,发现其他人也有同样的问题,但没有解决方案。 This question,例如。建议的解决方案是重定向到同一页面,这在我的用例中不起作用,因为我需要显示有关刚刚提交的表单的一些信息,包括成功消息,如果我重定向,该信息将丢失到同一页面。

【问题讨论】:

  • 清除表单时的错误可以删除吗?这是一种解决方法
  • @erikscandola,我可以,但我想了解错误的来源,看看是否有其他解决方案,然后再诉诸类似的方法。

标签: c# asp.net forms


【解决方案1】:

您收到消息的原因是因为调用了 Page.Validate(),这正是顾名思义。而且因为每次回发都会调用验证。

通常您不会将该代码放在 Page_Load 中,而是放在提交按钮的 onClick 中。

即:

    protected void SubmitButton_OnClick(object sender, EventArgs e)
    {
        Page.Validate();
        if (Page.IsValid)
        {
            SaveFormSubmissionToDatabase();
            MyTextBox.Text = "";
        }
    }

更新:让我细化原因。在原始帖子中,MyTextBox.Text = "" 并不是最后发生的事情。页面上的控件也会触发它们的事件和验证,这发生在 Page_Load 事件之后。

完整的生命周期参考:https://msdn.microsoft.com/en-us/library/ms178472.aspx#general_page_lifecycle_stages

【讨论】:

  • 感谢弗兰克的帮助,但我不太明白这可能是什么问题。我对Page.Validate() 的调用将Page.IsValid 保留为true,因此不应出现任何错误消息。然后我清除我的表单,以便用户可以再次输入它,并且必填字段验证器失败。为什么将它放在后面代码的不同部分会改变相同调用的行为方式?
  • 这是因为Page_Load 处于页面生命周期的早期。所有控件,包括验证器,都会在 Page_Load 之后执行它们的工作并发现页面不再有效。您可以通过设置 RequiredUserName.Enabled = false 来短路它,然后在 OnLoadComplete() 中重新启用它。
  • 有趣,我会尝试将它放在按钮的点击按钮中,看看它是否能让我到达任何地方。如果是这样,我一定会标记你的答案!谢谢。
  • 弗兰克,这确实解决了我的问题,非常感谢您添加有关生命周期的信息,解释在我将文本设置为空后如何触发验证。
猜你喜欢
  • 2016-12-14
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
相关资源
最近更新 更多