ASP.NET Core 5通过函数提交表单时data-ajax属性不生效问题
问题原因及解决方案
1. 为什么调用submit()不识别data-ajax相关属性
jquery.unobtrusive-ajax 库的核心实现逻辑是给所有标注 data-ajax="true" 的表单绑定了submit事件拦截器,会拦截默认的表单提交行为,读取表单上的所有data-*属性构造异步请求,完成局部更新逻辑。
你通过自定义函数调用 $("#rawform").submit() 时走的是原生表单提交逻辑,没有触发unobtrusive-ajax绑定的事件拦截,本质是因为原生HTMLFormElement的submit()方法不会触发submit事件,因此拦截逻辑不会执行,最终表现为直接跳转到服务端返回的新页面。
修复方案
把你的提交函数改成手动触发submit事件即可,unobtrusive-ajax的拦截逻辑会正常生效:
function doAjax4() { $("#rawform").trigger("submit"); }
2. $.ajax()请求添加防伪验证令牌的方法
ASP.NET Core默认要求POST请求携带防伪令牌,你可以通过两种方式实现:
方式一:序列化表单内容自动携带
只要你的表单内添加了@Html.AntiForgeryToken()(Razor语法),框架会自动生成隐藏的__RequestVerificationToken字段,序列化表单时会自动带上该字段:
$.ajax({ url: '/Test/_PartOfView', type: 'POST', data: $('#rawform').serialize(), // 自动包含防伪令牌和表单所有字段 success: function (res) { $('#ajupd').html(res); // 手动替换局部内容 } });
方式二:手动提取令牌放到请求头
如果是自定义参数不序列化完整表单,可以单独提取令牌放到请求头:
// 提取页面中生成的防伪令牌 var verifyToken = $('input[name="__RequestVerificationToken"]').val(); $.ajax({ url: '/Test/_PartOfView', type: 'POST', headers: { 'RequestVerificationToken': verifyToken }, data: { aVal: '自定义传入的参数' }, success: function (res) { $('#ajupd').html(res); } });
内容的提问来源于stack exchange,提问作者Bob Koury
相关产品推荐
相关产品推荐

