使用BindProperty绑定Integer时,如何抛出错误而非转为0?
解决Razor页面参数绑定无效输入返回4xx错误的方法
方法1:使用路由约束限定参数类型
直接在Razor页面的@page指令中添加整数类型约束,让路由仅匹配合法的整数参数:
@page "{foo:int}"
当请求/privacy/notandinteger这类非整数路径时,ASP.NET Core会找不到对应的路由,直接返回404 Not Found。这种方式无需额外代码,是最简洁的处理方案。
方法2:使用可空类型区分无效输入
将参数类型改为可空整数,绑定失败时会得到null而非默认的0,以此区分合法的0输入和无效的非整数输入:
在Privacy.cshtml.cs中修改代码:
[BindProperty(SupportsGet = true)] public int? Foo { get; set; } public IActionResult OnGet() { if (Foo == null) { return BadRequest("参数foo必须为有效整数"); } Console.WriteLine($"{this.Foo}"); return Page(); }
这种方式可以自定义错误信息,返回400 Bad Request状态码,明确告知客户端输入无效。
方法3:利用ModelState验证错误
ASP.NET Core在参数绑定失败时,会自动将错误信息存入ModelState,我们可以直接检查验证状态并返回错误响应:
[BindProperty(SupportsGet = true)] public int Foo { get; set; } public IActionResult OnGet() { if (!ModelState.IsValid) { return BadRequest(ModelState); } Console.WriteLine($"{this.Foo}"); return Page(); }
输入非整数时,ModelState会包含"值无法转换为Int32类型"的具体错误信息,返回400状态码的同时可以让客户端清晰了解问题原因。
内容的提问来源于stack exchange,提问作者user3243135
相关产品推荐
相关产品推荐

