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

ASP.NET Core加载分部视图后jQuery代码失效问题排查

问题描述

我有一个包含信息列表的页面,通过一系列字段结合Ajax实现信息搜索,加载分部视图重新刷新页面信息。但分部视图加载后,所有jQuery代码都失效了,刷新整个页面就正常。相关代码如下:

C# 后端代码

public async Task<IActionResult> InvoiceSearch(string CurrentPage, string createDate, int? id,
    int? remoteFactorNumber, string deliverToPhoneNumber, int? statusInvoice)
{
    try
    {
        var branchId = 0;

        if (!User.IsInRole(ConstantRoles.Admin))
        {
            branchId = User.Identity.GetBranchId();
        }

        var invoiceParams = new BranchInvoicesResourceParameters
        {
            PageNumber = !string.IsNullOrEmpty(CurrentPage) ? Convert.ToInt32(CurrentPage) : 1,
            CreateDateTime = createDate?.ToEnglishNumbers() ?? null,
            InvoiceId = id,
            RemoteFactorId = remoteFactorNumber,
            StatusInvoice = statusInvoice == null ? null : (StatusInvoice)statusInvoice,
            DeliverToPhoneNumber = deliverToPhoneNumber?.ToEnglishNumbers() ?? null,
            BranchId = branchId,
        };

        var branchInvoice = await _invoiceService.GetBranchInvoices(invoiceParams);
       
        return PartialView("_BranchInvoiceList", branchInvoice.Data);
    }
    catch(Exception ex)
    {
    }
}

Ajax 调用代码

function getSearchInvoice(page) {

    var createDate = $('#searchCreateDate').val();
    var id = $('#searchId').val();
    var remoteFactorNumber = $('#searchRemoteFactorNumber').val();
    var deliverToPhoneNumber = $('#searchDeliverToPhoneNumber').val();
    var statusInvoice = $('#searchStatusInvoice').val();

    var invoice = new Object();
    invoice.createDate = createDate;
    invoice.id = id;
    invoice.remoteFactorNumber = remoteFactorNumber;
    invoice.deliverToPhoneNumber = deliverToPhoneNumber;
    invoice.statusInvoice = statusInvoice;

    $.ajax({
        type: "Get",
        url: "@Url.Action("InvoiceSearch", "Home")",
        headers: {
            "RequestVerificationToken": requestVerificationToken
        },
        data: {
            CurrentPage: page,
            createDate: createDate,
            id: id,
            remoteFactorNumber: remoteFactorNumber,
            deliverToPhoneNumber: deliverToPhoneNumber,
            statusInvoice: statusInvoice
        },
        contentType: "application/json; charset=utf-8",
        dataType: "html",
        success: function (response) {
          
        },
        error: function (xhr, ajaxOptions, thrownError) {
     
    });
};
原因分析

这是典型的事件委托失效问题:

  • 页面初始化时,你写的jQuery事件绑定(比如点击、change事件)是直接绑定到当时DOM中存在的元素上的。
  • 通过Ajax加载分部视图后,新渲染出来的列表元素是动态新增的DOM节点,这些节点在页面初始化时不存在,所以之前绑定的事件不会作用在它们身上。
  • 刷新整个页面时,所有元素都是重新初始化的,事件绑定会重新作用在所有存在的元素上,所以正常工作。
解决方法

核心是用事件委托,把事件绑定到一个页面初始化时就存在的父级元素上(比如列表的容器,甚至document),而不是直接绑定到动态元素本身。

举个例子,假设你原来的事件绑定写法是这样:

// 旧写法:直接绑定,动态元素不生效
$('.invoice-item').click(function() {
    // 业务逻辑
});

改成事件委托的写法:

// 新写法:绑定到固定存在的父容器(比如#invoice-container)
$('#invoice-container').on('click', '.invoice-item', function() {
    // 业务逻辑
});

额外注意点:

  • 避免每次加载分部视图都重复执行事件绑定代码,否则可能导致事件多次触发,用事件委托可以从根源避免这个问题。
  • 确认Ajax成功回调里,是否把返回的HTML正确插入到了页面目标容器中(比如$('#target-container').html(response);),插入位置错误也可能引发异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:00:31