如何更正错误未捕获的 typeError 验证器未定义并防止我的表单在错误时发布

Posted

技术标签:

【中文标题】如何更正错误未捕获的 typeError 验证器未定义并防止我的表单在错误时发布【英文标题】:How do I correct the error uncaught typeError validator is undefined and prevent my form from post if error 【发布时间】:2021-06-05 06:31:50 【问题描述】:

这是我的情况。

第 1 部分:我按下 Index View.cshtml 上的链接以在调试模式下弹出我的模态 AddContact.cshtml(如下)如果我在文本框中键入任何内容或尝试,jquery 会抛出以下错误“typeError Validator not defined”使用下拉菜单。

请注意,我的索引视图有一个布局 _Layout.cshtml,其中包含脚本包:

@Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)

但是,当我构建部分视图时 AddContact.cshtml ...我不使用布局 _Layout.cshtml,这就是我得到 typeError 验证器的原因吗?

所以,我认为这是一个大问题,我该如何修复 typeError?

第 2 部分,在我意识到第 1 部分中的错误之前,我在下面的 javascript 中添加了 $.validate() 似乎我的表单 $(#contactForm).validate() 在我的表单上总是抛出一个 NOT有效的。我想要发生的是我的模型中定义的错误消息会出现,如果有错误,$.ajax() 帖子会被阻止。

  $("#btnSubmit").click(function () 
        if ($("#contactForm1").validate()) 
            alert("Form is Valid");
            return true;
         else 
            alert("Form is NOT Valid");
            return false;
        

        var frm = $('#contactForm1').serialize()

        $.ajax(

            type: "POST",
            url: "/Home/AddContact/",
            data: frm,
            success: function (ajaxRespond) 
                if (ajaxRespond.dbUpdateResult == "success") 
                    $("#myModal").modal("hide");
                    reloadContactLinks()
                
            
        )

    )

我有一个视图模型:设置了必需的注释

  public class Contact
    
        public int Contact_ID  get; set; 
        public int Dataset_ID  get; set; 
        public string Booth_UCID  get; set; 
        [Required(ErrorMessage = "First Name is a required field")]
        public string First_Name  get; set; 
        [Required(ErrorMessage = "Last Name is a required field")]
        public string Last_Name  get; set; 
        public string Title_Role  get; set; 
        public int Contact_Type_ID  get; set; 
        [Required(ErrorMessage = "Email is a required field")]
        public string Email  get; set; 
        [Required(ErrorMessage = "Phone Number is a required field")]
        public string Phone_Number  get; set; 
        public string Email_2  get; set; 
        public string Phone_Number_2  get; set; 
    

我的部分视图使用 JQuery Validate 和 Ajax Post

   @model ResearchDataInventoryWeb.Models.Contact
    @using (Html.BeginForm(new  id = "contactForm1" ))
    
        <div class="section_header2">Contact</div>
        <div style="padding-top:5px;">
            <table>
                <tr>
                    <td>
                        <span class="display-label">UCID/Booth ID</span>
                    </td>
                    <td>
                        @Html.TextBoxFor(model => model.Booth_UCID, new  placeholder = "<Booth/UCID>", @class = "input-box" )
                    </td>
                </tr>
                <tr>
                    <td>
                        <span class="display-label">Type</span>
                    </td>
                    <td>
                        <select class="input-box" id="contact_type">
                            <option value="contact_type">Contact Type*</option>
                            <option value="dataset_admin">Dataset Admin</option>
                            <option value="dataset_Provider">Dataset Provider</option>
                            <option value="department">Department</option>
                            <option value="external_collaborator">External Collaborator</option>
                            <option value="principal_investigator">Principal Investigator</option>
                            <option value="research_center">Research Center</option>
                            <option value="vendor">Vendor</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <span class="display-label">Name</span>
                    </td>
                    <td>
                        @Html.TextBoxFor(model => model.First_Name, new  placeholder = "<First Name>", @class = "input-box-modal" )
                        @Html.ValidationMessageFor(model => model.First_Name, "", new  @class = "text-danger" )
                        @Html.TextBoxFor(model => model.Last_Name, new  placeholder = "<Last Name>", @class = "input-box-modal" )
                        @Html.ValidationMessageFor(model => model.Last_Name, "", new  @class = "text-danger" )
                    </td>
                </tr>
                <tr>
                    <td>
                        <span class="display-label">Email</span>
                    </td>
                    <td>
                        @Html.TextBoxFor(model => model.Email, new  placeholder = "<Email 1>", @class = "input-box-modal" )
                        @Html.ValidationMessageFor(model => model.Email, "", new  @class = "text-danger" )
                        @Html.TextBoxFor(model => model.Email_2, new  placeholder = "<Email 2>", @class = "input-box-modal" )
                    </td>
                </tr>
                <tr>
                    <td>
                        <span class="display-label">Phone</span>
                    </td>
                    <td>
                        @Html.TextBoxFor(model => model.Phone_Number, new  placeholder = "<Phone 1>", @class = "input-box-modal" )
                        @Html.ValidationMessageFor(model => model.Phone_Number, "", new  @class = "text-danger" )
                        @Html.TextBoxFor(model => model.Phone_Number_2, new  placeholder = "<Phone 2>", @class = "input-box-modal" )
                    </td>
                </tr>
                <tr>
                    <td>
                        <span class="display-label">Job Title</span>
                    </td>
                    <td>
                        @Html.TextBoxFor(model => model.Title_Role, new  placeholder = "<Job Title>", @class = "input-box" )
                    </td>
                </tr>
                <tr>
                    <td>
                        <span class="display-label">Organization</span>
                    </td>
                    <td>
                        <input class="input-box" type="text" placeholder="<Organization>" />
                    </td>
                </tr>
    
            </table>
            <div style="padding-left:10px; margin-top:10px;">
                <textarea rows="3" placeholder="Notes"></textarea>
            </div>
        </div>
        <div class="centerButton" style="margin-top: 30px;">
            <div style="margin-left:30px">
                <submit id="btnSubmit" class="btn btn-default btn-sm" style="padding:14px"><span class="smallText_red" style="padding:30px">SAVE</span></submit>
            </div>
            <div style="margin-left:30px">
                <submit class="btn btn-default btn-sm" style="padding:14px"><span class="smallText_red" style="padding:30px">REMOVE</span></submit>
            </div>
        </div>
    
    <script type="text/javascript">
        $("#btnSubmit").click(function () 
            if ($("#contactForm1").validate()) 
                alert("Form is Valid");
                return true;
             else 
                alert("Form is NOT Valid");
                return false;
            
    
            var frm = $('#contactForm1').serialize()
    
            $.ajax(
    
                type: "POST",
                url: "/Home/AddContact/",
                data: frm,
                success: function (ajaxRespond) 
                    if (ajaxRespond.dbUpdateResult == "success") 
                        $("#myModal").modal("hide");
                        reloadContactLinks()
                    
                
            )
    
        )
    
    </script>

【问题讨论】:

这有用吗? ***.com/a/53513205/3825777 你能试着做一个这样的可运行的sn-p吗? ***.com/a/33681460/3825777 或者,像这样的 jsfiddle? jsfiddle.net/duAkn 还是这个? jsfiddle.net/Vikrant29/jr346y1u/5 感谢您的回复,但这些都不能解决我的问题。 谢谢你的帮助,但我不知道如何做代码sn-p $(function() ... your code here ... ); 将在 documentReady 上设置您的处理程序,即构建 DOM 模型。可能这会产生问题。 @Reflective 我不明白如何使用 $(function() ... my code ... 这是否意味着将其包裹在我的 $("btnSumbit).click(functio( ) ) 哪个有效,或者您是否建议将我的代码包装在 $(document).ready() 中。不过,谢谢,这个项目充满了开始和停止 【参考方案1】:

如果你想在 DOM 上工作,它应该已经准备好了,所以我建议你这样改变它,我希望它会有所帮助。如果没有,我们应该寻找其他问题。

编辑!!!这是一个非常粗略的示例,可能存在一些问题,但这是您应该使用验证器的方式。验证器捕获onsubmit 表单事件,因此不需要点击处理程序,如果你这样做,我相信第一次点击事件已被处理,它是蝙蝠。

<script type="text/javascript">
$(function()  

  var validator = $("contactForm1").validate(
      submitHandler: function(form)
          $(form).find('input[type=submit]').attr('disabled', 'disabled');
          var frm =$(form).serialize()    
          $.ajax(
              type: "POST",
              url: "/Home/AddContact/",
              data: frm,
              success: function (ajaxRespond) 
                if (ajaxRespond.dbUpdateResult == "success") 
                    $("#myModal").modal("hide");
                    reloadContactLinks()
                
              
          )    
      
  );

);
</script>

【讨论】:

我按照你说的做了,$("#contactForm1).validate() 总是假的。如果我把 $("#contactForm1).validate() 拿出来,表单会运行 $ .ajax 没问题,但我不希望这是表单有错误,这太令人沮丧了,因为除了检查任何其他建议的错误外,它的效果很好。真的非常感谢你的尝试,我没想到会有任何回应 我现在是凌晨 3 点 - 如果仍然没有正确答案,我明天再看看 你不应该使用 '.click` 而是使用带有参数的 $("#contactForm1").validate()。成功提交有一个内部处理程序 哇,你工作到很晚。非常感谢你,如果我发现了什么,我一定会告诉你的。我通常会弄清楚这些事情,但到目前为止我还不是专家。我写了很多系统,但都是反复试验 您还应该在 HTML 中添加您的规则或将它们指定为 validate 中的选项...如果它只是 required 并且您有输入,您可以像这样添加它 &lt;input name="somename" value="somevalue" required&gt;。顺便说一句,现代浏览器也将检查此属性(必需),如果字段未完成,即使不使用 jquery 验证器也会发出错误信号,但在这里您有更多选择。

以上是关于如何更正错误未捕获的 typeError 验证器未定义并防止我的表单在错误时发布的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 Promise 错误:TypeError:成员不是函数

如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?

如何修复 PHPUnit 中的“PHP 致命错误:未捕获的 TypeError:getTest() 参数”错误

未捕获的TypeError:googleAuth.then不是函数

未捕获的 TypeError:“#login”.validate 不是函数

如何修复未捕获的 TypeError:无法读取 null 的属性“outerHTML”