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

Asp.Net Core 3.1中asp-all-route-data关联Action方法未触发求助

问题诊断与修复方案

我来帮你拆解下这个问题:你的菜单点击后没有触发GetSubMenu Action,核心原因是自定义的click事件阻止了ASP.NET Unobtrusive Ajax的原生执行逻辑,再加上同步Ajax的阻塞,导致原本的data-ajax锚标签请求根本没发出去。

具体来说:

  • 你在click事件里调用了e.preventDefault(),这直接取消了锚标签的默认行为——而ASP.NET的Unobtrusive Ajax正是依赖锚标签的原生点击事件来发起请求的。
  • SetCurrentPageNameSession里的async:false会阻塞浏览器线程,不仅体验差,还会干扰后续的异步逻辑执行。

下面给你两种可行的修复方案,按需选择:

方案一:利用Unobtrusive Ajax原生钩子(推荐)

这种方式最简洁,直接用框架提供的data-ajax-beforeSend属性,在Ajax请求发起前完成会话存储,完全避免自定义事件的冲突。

1. 修改锚标签,添加前置钩子

把你的锚标签代码改成这样,新增data-ajax-beforeSend属性来指定会话存储的方法:

<a class="@clas" 
   data-ajax="true" 
   data-ajax-beforeSend="SetCurrentPageNameSession('@M.MenuName', false)"
   data-ajax-complete="RedirectToPage('@M.MenuUrl', '@M.MenuName',true)" 
   data-ajax-mode="replace" 
   data-ajax-update="#myTab" 
   asp-action="GetSubMenu" 
   asp-controller="Base" 
   asp-all-route-data="@allRouteData">@M.MenuName</a>

2. 调整会话存储方法为异步

把SetCurrentPageNameSession改成异步模式,去掉同步阻塞,同时返回true让Ajax请求继续执行:

function SetCurrentPageNameSession(CurrentPage, IsBookMark) {
    if (IsBookMark === undefined) IsBookMark = false;
    var url = baseUrl + "Manage/HighlightCurrentMenu/";
    
    // 异步执行会话存储,不阻塞后续逻辑
    $.ajax({
        type: "POST",
        data: { CurrentPage: CurrentPage, IsBookMark: IsBookMark },
        url: url,
        dataType: "json",
        error: function (xhr, ajaxOptions, thrownError) {
            console.error("更新会话失败:", thrownError);
        }
    });
    
    // 返回true,允许Unobtrusive Ajax继续发起请求
    return true;
}

3. 移除自定义的click事件

现在不需要自己绑定click事件了,Unobtrusive Ajax会自动处理点击逻辑,同时在请求前执行你的会话存储操作。

方案二:保留自定义click事件,手动触发Ajax请求

如果你必须保留现有的click事件逻辑,可以通过手动触发Unobtrusive Ajax的请求来解决:

1. 改造会话存储方法为Promise

让方法返回Promise,方便我们等待异步操作完成:

function SetCurrentPageNameSession(CurrentPage, IsBookMark) {
    if (IsBookMark === undefined) IsBookMark = false;
    var url = baseUrl + "Manage/HighlightCurrentMenu/";
    
    // 返回Promise,让调用方可以等待操作完成
    return $.ajax({
        type: "POST",
        data: { CurrentPage: CurrentPage, IsBookMark: IsBookMark },
        url: url,
        dataType: "json",
        error: function (xhr, ajaxOptions, thrownError) {
            console.error("更新会话失败:", thrownError);
        }
    });
}

2. 修改click事件,手动发起Ajax请求

在会话存储完成后,手动读取锚标签的Ajax配置并发起请求:

$('#myTab>li>a.nav-link.btn.fuse-ripple-ready').on("click", function (e) {
    e.preventDefault(); // 仍然阻止默认跳转,避免页面刷新
    var $link = $(this);
    var requestedPage = $link.text();

    // 先完成会话存储,再手动触发Ajax请求
    SetCurrentPageNameSession(requestedPage, false)
        .done(function() {
            // 检查当前链接是否配置了Unobtrusive Ajax
            if ($link.data('ajax')) {
                // 获取并合并Ajax配置
                var ajaxConfig = $.extend({}, $.ajaxSettings, $link.data('ajax-options'), {
                    url: $link.attr('href'),
                    type: 'GET',
                    success: function(data) {
                        // 更新目标容器内容
                        $(ajaxConfig.update).html(data);
                        // 执行complete回调
                        if (typeof ajaxConfig.complete === 'function') {
                            ajaxConfig.complete();
                        }
                    }
                });
                // 发起请求
                $.ajax(ajaxConfig);
            }
        });
});

额外检查

别忘了确认你的项目中已经正确引入了jquery.unobtrusive-ajax.min.js——这个脚本是ASP.NET Core实现data-ajax系列属性的核心,没有它的话,锚标签的Ajax配置根本不会生效。

内容的提问来源于stack exchange,提问作者V.Prasad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:17:46