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

如何在JavaScript中调用Asp.NET PageModel?POST请求400报错求助

问题分析与解决方案

一、POST请求400错误的核心原因及修复

1. 缺失CSRF令牌验证

ASP.NET Razor Pages默认强制启用CSRF保护,所有POST请求必须携带__RequestVerificationToken,否则直接返回400错误。

2. 参数绑定格式不匹配

后端OnPostAdd方法使用[FromBody] string msg,但前端发送的是application/x-www-form-urlencoded格式的表单数据,而非JSON格式,导致参数无法正确绑定。


二、快速修复代码

前端脚本与页面修改

先在循环的表单内添加CSRF令牌,再调整fetch请求携带令牌:

@foreach (var journal in Model.journals)
{
    <form method="post">
        @Html.AntiForgeryToken() <!-- 新增CSRF令牌 -->
        <tr onclick="RazorFunction('test')">
            <td>@journal.name</td>
            <td>@journal.type.ToString()</td>
        </tr>
    </form>
}

@section Scripts
{
    <script>
        function RazorFunction(msg) {
            // 获取页面中的CSRF令牌
            const token = document.querySelector('input[name="__RequestVerificationToken"]').value;
            
            // 修复后的POST请求
            fetch('?handler=Add', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'RequestVerificationToken': token // 携带令牌
                },
                body: 'msg=' + encodeURIComponent(msg),
            });
        }
    </script>
}

后端代码修改

去掉[FromBody],让后端直接绑定表单参数:

public void OnPostAdd(string msg)
{
    Console.WriteLine("OnPostAdd!!!!!! : " + msg);
}

如果偏好JSON格式传递数据,可调整为:

  • 前端:
fetch('?handler=Add', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'RequestVerificationToken': token
    },
    body: JSON.stringify(msg),
});
  • 后端保留[FromBody]:
public void OnPostAdd([FromBody] string msg)
{
    Console.WriteLine("OnPostAdd!!!!!! : " + msg);
}

三、更优实现方案

1. 避免每行嵌套表单(减少DOM冗余)

将表单移到表格外,通过隐藏字段传递行数据:

<table class="table">
    <tbody>
        @foreach (var journal in Model.journals)
        {
            <tr data-journal-id="@journal.id" onclick="handleRowClick(this)">
                <td>@journal.name</td>
                <td>@journal.type.ToString()</td>
            </tr>
        }
    </tbody>
</table>
<!-- 单个表单复用 -->
<form id="journalForm" asp-page-handler="Add" method="post">
    <input type="hidden" name="msg" id="msgInput" />
    <input type="hidden" name="journalId" id="journalIdInput" />
</form>

配套脚本:

function handleRowClick(row) {
    const journalId = row.dataset.journalId;
    document.getElementById('msgInput').value = 'test';
    document.getElementById('journalIdInput').value = journalId;
    document.getElementById('journalForm').submit();
}

后端接收多参数:

public void OnPostAdd(string msg, int journalId)
{
    Console.WriteLine($"OnPostAdd: {msg}, JournalID: {journalId}");
}

2. 异步响应处理

将后端方法改为返回JSON结果,方便前端处理操作反馈:

public IActionResult OnPostAdd(string msg)
{
    Console.WriteLine("OnPostAdd!!!!!! : " + msg);
    return new JsonResult(new { success = true, message = "操作完成" });
}

前端添加响应处理:

fetch('?handler=Add', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'RequestVerificationToken': token
    },
    body: 'msg=' + encodeURIComponent(msg),
})
.then(res => res.json())
.then(data => {
    if (data.success) {
        alert(data.message);
        // 可在此刷新页面或更新表格
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:30:24