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
相关产品推荐
相关产品推荐

