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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:40:28