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

