如何将a标签中的name.report值不通过URL传递给控制器
视图代码改造
先给每个菜单元素新增自定义属性存储需要传递的Report值,避免写死在URL中:
@foreach (var name in Model.namesReport) { <li class=""> <a class="menu_name" data-report="@name.Report">@name.ReportName</a> </li> }
方案1:AJAX POST传参(无页面刷新场景适用)
适合点击菜单后仅局部加载报表内容的场景,参数放在请求体中,不会出现在URL:
前端JS代码
document.querySelectorAll('.menu_name').forEach(menu => { menu.addEventListener('click', function () { // 取自定义属性存储的Report值 const reportVal = this.dataset.report; // 发起POST请求到对应控制器接口 fetch('/[你的控制器名称]/[你的Action名称]', { method: 'POST', headers: { 'Content-Type': 'application/json', 'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]').value }, body: JSON.stringify({ report: reportVal }) }).then(res => res.json()) .then(result => { // 处理接口返回结果,比如渲染报表内容 }) }) })
控制器代码
[HttpPost] [ValidateAntiForgeryToken] public IActionResult GetReport([FromBody] string report) { // 此处编写业务逻辑处理report参数 return Json(你的返回结果); }
方案2:隐藏表单POST提交(页面跳转场景适用)
适合点击菜单后需要跳转到新页面展示报表的场景,参数完全通过请求体传递,无URL暴露风险:
新增隐藏表单
在当前视图任意位置添加全局隐藏表单:
<form id="reportPostForm" method="post" action="/[你的控制器名称]/[你的Action名称]" style="display: none;"> <input type="hidden" id="reportParam" name="report" /> @Html.AntiForgeryToken() </form>
前端JS代码
document.querySelectorAll('.menu_name').forEach(menu => { menu.addEventListener('click', function () { const reportVal = this.dataset.report; document.getElementById('reportParam').value = reportVal; // 提交表单实现跳转 document.getElementById('reportPostForm').submit(); }) })
控制器代码
[HttpPost] [ValidateAntiForgeryToken] public IActionResult ShowReport(string report) { // 此处编写业务逻辑处理report参数 return View(); }
注意事项
- 两种方案均不会将
report参数暴露在URL中,符合需求 - 如果项目引入了jQuery,可以将上述原生JS代码替换为jQuery实现,逻辑完全一致
- 若你的控制器未开启防伪校验,可以去掉代码中对应的防伪token相关配置
内容的提问来源于stack exchange,提问作者Diogo Silva
相关产品推荐
相关产品推荐

