ASP.. NET服务器端验证未触发

本文关键字:验证 NET 服务器端 ASP | 更新日期: 2023-09-27 18:17:29

在我的应用程序服务器端验证功能不工作。甚至函数都没有被调用。我已经把调试器放在那个函数上,但它并没有停止我的调试器。函数没有被调用

<asp:TextBox type="text" ID="txtMobilePhone" runat="server" ClientIDMode="Static" CausesValidation="true"/>
                        <asp:CustomValidator ID="cvMobilePhone" runat="server" OnServerValidate="cvMobilePhone_ServerValidate" 
                            Text="Mobile Phone already exist in this Reward Program." ErrorMessage="Mobile Phone already exist in this Reward Program."
                            Display="Dynamic" ValidationGroup="vgStep2" ControlToValidate="txtMobilePhone" CssClass="error"></asp:CustomValidator>
                        <asp:RequiredFieldValidator ID="rfvMobilePhone" runat="server" ControlToValidate="txtMobilePhone"
                            ErrorMessage="Mobile Phone is required." CssClass="error" ValidationGroup="vgStep2"></asp:RequiredFieldValidator>
                        <asp:CustomValidator ID="cvMobilePerVal" runat="server" ClientValidationFunction="validateEmailOrMobilePerVal"
                            Display="Dynamic" ValidationGroup="vgStep2"></asp:CustomValidator>

 <asp:Button ID="btnStep2Upper" runat="server" ClientIDMode="Static" OnClick="btnSaveContactClick" Text="Save" ValidationGroup="vgStep2" vg="vgStep2" OnClientClick="return ClientValidate();" />

服务器端代码

    protected void cvMobilePhone_ServerValidate(object source, ServerValidateEventArgs value)
        {  /* I have put debugger here but control is not coming here*/
            /* my validation logic*/
protected void cvMobilePhone_ServerValidate(object source, ServerValidateEventArgs value)
    {
        if (txtMobilePhone.Text.Trim() != "")
        {
            RewardProgramDataContext db = new RewardProgramDataContext();
            Boolean f = false;
            string MobilePhone = cmnFunc.RemoveMobilePhoneFormat(txtMobilePhone.Text.Trim());
            if (Request["id"] != null)
            {
                var cData = db.spContactSelectAllSingle(new Guid(Request["id"])).SingleOrDefault();
                if (cData != null)
                {
                    if (cmnFunc.RemoveMobilePhoneFormat(cData.MobilePhone) == MobilePhone)
                    {
                        f = true;
                        value.IsValid = true;
                    }
                }
            }
            if (f == false)
            {
                var res = db.spContactDuplicateMobile(new Guid(ddlContactList.SelectedValue), MobilePhone).SingleOrDefault();
                if (res.Column1 <= 0)
                {
                    value.IsValid = true;
                    customIsValid = true;
                }
                else
                {
                    value.IsValid = false;
                    customIsValid = false;
                }
            }
        }
    }

现在,当我点击提交按钮时,所有客户端验证工作,但服务器端自定义验证器没有调用

ASP.. NET服务器端验证未触发

您忘记设置ControlToValidate属性?

<asp:CustomValidator ID="cvMobilePhone" runat="server" ControlToValidate="txtMobilePhone" OnServerValidate="cvMobilePhone_ServerValidate" 
                            Text="Mobile Phone already exist in this Reward Program." ErrorMessage="Mobile Phone already exist in this Reward Program."
                            Display="Dynamic" ValidationGroup="vgStep2" CssClass="error"></asp:CustomValidator>

你有两个不同的组合导致这种行为。

首先,请注意,尽管正如其他人所说,您不必指定ControlToValidate,但这样做会限制服务器端自定义验证事件触发的情况。具体来说,如果你不设置它,事件总是在回发时触发,而如果你设置它,事件只在ControlToValidate标识的控件具有非空值时触发

其次,通过指定OnClientClick,你告诉框架你将负责客户端验证,除非你从OnClientClick函数调用它,否则它现在不会触发。虽然你没有在你的问题中包括你的ClientValidate函数,但我怀疑你没有这样做,这使得你的RequiredFieldValidator无力阻止回发。

结合起来,这两件事意味着

  • 尽管
为空文本框,但仍发生回发,并且
  • 服务器端自定义验证在回发时不触发,因为为空文本框。
  • 您可以使用Page_ClientValidate())从您的自定义函数调用客户端验证,该函数将出现在您的页面脚本中,因为页面包含验证器。

    function ClientValidate() {
        if (Page_ClientValidate()) {
            //do custom validation, maybe return false 
            return true;
        }
        else {
            return false;
        }
    }