You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Asp.net Core MVC局部视图验证失效,报Uncaught TypeError错误

解决Asp.net Core MVC Ajax加载局部视图后验证失效的问题

嘿,作为刚接触Asp.net Core MVC的新手,遇到动态加载局部视图后验证失效的问题太正常了!我来帮你拆解一下问题和解决办法:

问题根源

你遇到的Uncaught TypeError: Cannot read property 'settings' of undefined错误,本质是jQuery Unobtrusive Validation只在页面初始加载时绑定到DOM元素,而通过Ajax动态加载的局部视图内容,并没有被Validation框架识别和绑定规则。原来的验证脚本不知道新添加的表单元素存在,自然就会报错。

解决方案

1. 确保脚本引入顺序正确

首先检查主视图(Create.cshtml)里的脚本引入顺序,必须严格按照这个顺序来:

<!-- 先引入jQuery核心库 -->
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<!-- 再引入jQuery Validate插件 -->
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<!-- 最后引入非侵入式验证适配脚本 -->
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

顺序错了很容易导致各种奇怪的验证错误,这是新手常踩的坑!

2. Ajax加载后重新初始化验证

在你用jQuery Ajax加载局部视图的成功回调函数里,需要手动触发非侵入式验证的解析,让Validation框架识别新添加的DOM元素。

举个例子,假设你的Ajax代码是这样的:

$.ajax({
    url: "/Ledger/LoadPartialView", // 你的局部视图接口地址
    type: "GET",
    success: function (result) {
        // 将局部视图内容插入到页面容器中
        $("#partialContainer").html(result);
        
        // 关键步骤:重新初始化非侵入式验证
        $.validator.unobtrusive.parse("#partialContainer");
        
        // 额外:如果局部视图里有表单,也可以重新绑定表单的验证事件
        $("#partialContainer form").removeData("validator").removeData("unobtrusiveValidation");
        $.validator.unobtrusive.parse("#partialContainer form");
    },
    error: function (xhr, status, error) {
        console.error("加载局部视图失败:" + error);
    }
});

这里的核心是$.validator.unobtrusive.parse()方法,它会重新扫描指定容器内的表单元素,绑定验证规则。

3. 局部视图不要重复引入脚本

注意你的局部视图里不要再次引入jQuery、Validate相关脚本,否则会导致脚本重复加载,引发冲突,反而让验证更混乱。局部视图只需要放表单和元素即可。

4. 检查表单的name属性

确保局部视图里的表单元素都有正确的name属性(和模型的属性名对应),因为jQuery Validation是通过name属性来识别验证规则的,没有name属性的话验证也会失效。

验证测试

完成以上步骤后,刷新页面,重新加载局部视图,试试触发验证(比如提交空表单),应该就能正常触发验证规则,不会再出现那个settings未定义的错误了。

内容的提问来源于stack exchange,提问作者Kicha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:03:40