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

.NET 5 模态框中如何触发Model Validation 提交无效跳转问题求解

问题根因

模态框内的表单使用了默认同步提交方式,校验失败后后端返回完整视图,浏览器会直接整页渲染返回内容,自然就跳出了模态框。


修复步骤

1. 调整控制器逻辑

首先补全GET Create方法返回分部视图避免加载多余布局;同时修改POST Create方法,适配ajax请求的返回逻辑:

// 新增GET Create方法,返回分部视图
public IActionResult Create()
{
    return PartialView();
}

//POST CREATE
[HttpPost]
[AutoValidateAntiforgeryToken]
public IActionResult Create(Models.Customer obj)
{
    if (ModelState.IsValid)
    {
        _db.Customers.Add(obj);
        _db.SaveChanges();
        // 判断是否为ajax请求
        if (Request.Headers["X-Requested-With"] == "XMLHttpRequest")
        {
            return Json(new { success = true });
        }
        return RedirectToAction("Index");
    }

    if (Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    {
        // 校验失败返回带错误信息的分部视图
        return PartialView(obj);
    }
    return View(obj);
}

2. 修改Create.cshtml视图

首先确认该视图没有设置Layout(或者显式加Layout = null;),然后给form标签添加id标识:

<form id="createCustomerForm" method="post" asp-action="Create">
<!-- 原有表单内容保持不变 -->

3. 调整JS逻辑

新增表单异步提交逻辑,阻止默认同步跳转,同时动态加载内容后重新初始化客户端校验:

@section Scripts{
    <script type="text/javascript">
    $(document).ready(function () {
        $("#btnAddCustomer").on("click", function (e) {
            var options = { "backdrop": "static", keyboard: true };
            $.ajax({
                type: "GET",
                url: '@Url.Action("Create", "Customer")',
                success: function (data) {
                    $('#modalBody').html(data);
                    $('#modalCustomer').modal(options);
                    $('#modalCustomer').modal('show');
                    // 动态加载表单后初始化校验规则
                    $.validator.unobtrusive.parse('#createCustomerForm');
                },
                error: function () {
                    alert("Dynamic content load failed.");
                }
            });
        });

        // 监听表单提交事件,走异步提交
        $(document).on('submit', '#createCustomerForm', function(e) {
            e.preventDefault();
            var form = $(this);
            // 先触发客户端校验
            if(!form.valid()) return;

            $.ajax({
                type: form.attr('method'),
                url: form.attr('action'),
                data: form.serialize(),
                success: function(res) {
                    if(res.success) {
                        // 提交成功,关闭模态框刷新列表
                        $('#modalCustomer').modal('hide');
                        location.reload();
                        // 若要优化性能可改为局部刷新客户列表,无需重载整个页面
                    } else {
                        // 校验失败,替换模态框内的表单内容
                        $('#modalBody').html(res);
                        $.validator.unobtrusive.parse('#createCustomerForm');
                    }
                },
                error: function() {
                    alert('提交失败,请稍后重试');
                }
            });
        });
    });
    </script>
}

4. 额外检查项

确认布局页或Index页已经正确引入以下校验脚本,且加载顺序在你自定义的JS之前:

<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

修改完成后,校验失败的错误信息会直接在模态框内的表单上展示,不会再发生整页跳转的情况。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:57:04