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

