ASP.NET中ModelState.IsValid校验returnUrl参数问题求助
解决方案
针对你遇到的returnUrl为null时ModelState.IsValid校验失败的问题,有两种简洁的解决办法:
方法1:将returnUrl声明为可空字符串
.NET 6及以上版本默认启用了Nullable Reference Types,普通string类型会被视为非空类型,当传入null时会触发模型校验错误。只需把参数类型改为string?,允许空值即可:
[AllowAnonymous] [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Login([Bind("Email,Password")] LoginViewModel data, string? returnUrl) { if (!ModelState.IsValid) return View(data); // todo throw custom error if user does not exist ClassUser? user = _context.Users.FirstOrDefault(x => x.Email == data.Email); //... }
方法2:给returnUrl添加[BindNever]特性
这个特性会告知模型绑定系统忽略该参数,自然不会对它进行校验:
[AllowAnonymous] [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Login([Bind("Email,Password")] LoginViewModel data, [BindNever] string returnUrl) { if (!ModelState.IsValid) return View(data); // todo throw custom error if user does not exist ClassUser? user = _context.Users.FirstOrDefault(x => x.Email == data.Email); //... }
原因说明
问题的核心是Nullable Reference Types的默认行为:启用后,非空引用类型参数不允许接收null值,而你从根页面跳转登录时returnUrl恰好为null,因此触发了校验失败。第一种方法更符合现代C#的语法规范,优先推荐;第二种方法适合你明确不想让该参数参与模型绑定的场景。
内容的提问来源于stack exchange,提问作者eSPeZet
相关产品推荐
相关产品推荐

