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

ASP.NET 5 Core MVC Identity带角色授权注册表单提交报错求解

问题根因及解决方法

1. 表单字段模型绑定失败(仅下拉框有值其余为null)

你在所有文本、密码输入框上手动添加了name属性,覆盖了asp-for标签助手自动生成的绑定名称:

  • 使用asp-for="Input.FirstName"时,框架会自动生成符合模型绑定规则的name="Input.FirstName"属性
  • 你手动添加的name="firstname"和后端InputModel的属性路径不匹配,导致提交后这些字段无法完成绑定,全部为null,触发Required验证规则,直接返回ModelState.IsValid=false
  • 角色下拉框没有手动设置name属性,因此绑定正常,是唯一能拿到值的字段

解决方法:删除所有input标签上手动添加的name属性即可,让asp-for自动生成正确的绑定名称。


2. ArgumentNullException空异常报错

当ModelState验证失败直接返回页面时,你没有重新为ViewData["roles"]赋值:

  • 你的现有代码仅在创建用户失败的分支才会重新加载角色列表到ViewData
  • 验证失败直接走最终的return Page()时,ViewData["roles"]为null,渲染下拉框时asp-items接收到null参数,直接抛出空异常

解决方法:在Post方法最终返回页面前统一加载角色列表,修改代码如下:

// If we got this far, something failed, redisplay form
ViewData["roles"] = _roleManager.Roles.ToList();
return Page();

可选优化建议

你当前获取角色的代码用了同步阻塞异步方法的写法:var role = _roleManager.FindByIdAsync(Input.Name).Result;,容易引发线程死锁,建议改为异步await调用,同时增加空判断避免后续空引用:

var role = await _roleManager.FindByIdAsync(Input.Name);
if (role == null)
{
    ModelState.AddModelError(string.Empty, "所选角色不存在");
    ViewData["roles"] = _roleManager.Roles.ToList();
    return Page();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:54:03