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

如何让Blazor应用接受POST请求?解决400错误问题

Blazor允许跨页面POST请求并避免400错误的解决方案

问题分析

你遇到的400错误本质是Blazor默认启用的防伪造令牌验证导致的——纯HTML表单提交时没有携带Blazor要求的防伪造令牌,即使添加@attribute [IgnoreAntiforgeryToken]也可能因位置不正确未生效。

具体解决方案

1. 正确设置忽略防伪造令牌

  • Razor页面接收POST:直接在接收请求的ClientReports页面顶部添加属性,确保作用于整个页面的POST处理逻辑:
    @page "/ClientReports"
    @attribute [IgnoreAntiforgeryToken]
    @model ClientReportsModel
    
    @* 页面内容 *@
    
    @code {
        public class ClientReportsModel : PageModel
        {
            [BindProperty]
            public List<string> Params { get; set; }
    
            public IActionResult OnPost()
            {
                // 处理接收到的Params参数
                return Page();
            }
        }
    }
    
  • API控制器接收POST:如果用API控制器处理请求,在对应Action或控制器上添加属性:
    [ApiController]
    [Route("[controller]")]
    public class ClientReportsController : ControllerBase
    {
        [HttpPost]
        [IgnoreAntiforgeryToken]
        public IActionResult Post([FromForm] List<string> Params)
        {
            // 处理参数
            return Ok();
        }
    }
    

2. 配置CORS允许任意来源POST(若需跨域)

如果POST请求来自不同域名,在Program.cs中配置CORS策略:

var builder = WebApplication.CreateBuilder(args);

// 添加CORS服务
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAllOrigins", policy =>
    {
        policy.AllowAnyOrigin()
              .AllowAnyMethod()
              .AllowAnyHeader();
    });
});

// 添加Blazor服务(根据项目类型选择Server或WASM)
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();

var app = builder.Build();

// 启用CORS中间件(注意顺序,需在路由之前)
app.UseCors("AllowAllOrigins");

app.UseRouting();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

注意:生产环境建议替换AllowAnyOrigin()为具体允许的域名,避免安全风险。

3. 确保参数绑定正确

你的表单中多个同名name="Params"的隐藏输入框,需要用集合类型(如List<string>)接收,且接收端的属性名需与表单name完全一致,否则会出现参数绑定失败。

4. 替代方案:使用Blazor原生EditForm

如果不想手动处理防伪造令牌,可用Blazor的EditForm组件,它会自动生成并携带防伪造令牌,避免400错误:

<EditForm Action="/ClientReports" Method="post" Target="_blank">
    @foreach (var id in SelectedClientIds)
    {
        <InputHidden Name="Params" Value="@id" />
    }
    <button type="submit">Client Reports</button>
</EditForm>

@code {
    public List<string> SelectedClientIds { get; set; } = new List<string>();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:20:38