asp.net - ArgumentNullException:值不能为空。(参数“项目”)使用具有角色授权的身份的注册表单
问题描述
我刚刚开始 ASP.NET 5 Core MVC。我使用身份进行注册。当我提交注册表时,Model.isValid 在剃须刀页面的帖子中返回 false。唯一发布的是下拉项,所有其他项都是空的。如果我从注册表中删除角色下拉列表,然后提交它工作正常。(Input.Name 是角色)
namespace SoftcodeWebGem.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class RegisterModel : PageModel
{
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly UserManager<ApplicationUser> _userManager;
private readonly ILogger<RegisterModel> _logger;
private readonly IEmailSender _emailSender;
private readonly RoleManager<IdentityRole> _roleManager;
public RegisterModel(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
ILogger<RegisterModel> logger,
IEmailSender emailSender,
RoleManager<IdentityRole> roleManager)
{
_userManager = userManager;
_signInManager = signInManager;
_logger = logger;
_emailSender = emailSender;
_roleManager = roleManager;
}
[BindProperty]
public InputModel Input { get; set; }
public string ReturnUrl { get; set; }
public IList<AuthenticationScheme> ExternalLogins { get; set; }
public class InputModel
{
[Required]
[DataType(DataType.Text)]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
public string Name { get; set; }
}
//public void OnGet(string returnUrl = null)
//{
// ViewData["roles"] = _roleManager.Roles.ToList();
// ReturnUrl = returnUrl;
//}
public async Task OnGetAsync(string returnUrl = null)
{
ViewData["roles"] = _roleManager.Roles.ToList();
ReturnUrl = returnUrl;
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl ??= Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
var role = _roleManager.FindByIdAsync(Input.Name).Result;
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email, FirstName = Input.FirstName, LastName = Input.LastName };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
await _userManager.AddToRoleAsync(user, role.Name);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl });
}
else
{
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
ViewData["roles"] = _roleManager.Roles.ToList();
}
// If we got this far, something failed, redisplay form
return Page();
}
}
调试 的屏幕截图
下面的代码是 Select 元素
@page
@model RegisterModel
@{
ViewData["Title"] = "Register";
var roles = (List<IdentityRole>)ViewData["roles"];
}
<div class="container">
<div style="padding-top:80px;"></div>
<div class="container pt-5 pb-3" style="background-color: white;
width:500px; height:auto; border-radius:10px;">
<div class="text-center">
<h3>Softcode Gem Solution</h3>
<h6><img src="~/images/icons/add_user_male_32px.png" alt="Register" />Register with your Credentials</h6>
</div>
<form asp-route-returnUrl="@Model.ReturnUrl" method="post">
@Html.AntiForgeryToken()
<div class="form-floating mb-3 ">
<input asp-for="Input.FirstName" type="text" class="form-control" id="firstname" name="firstname" placeholder="First Name" style="border-radius: 5px; ">
<label asp-for="Input.FirstName"><img src="~/images/icons/name_24px.png" />First Name</label>
<span asp-validation-for="Input.FirstName" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<input asp-for="Input.LastName" type="text" class="form-control" id="lastname" name="lastname" placeholder="Last Name" style="border-radius: 5px; ">
<label asp-for="Input.LastName"><img src="~/images/icons/name_24px.png" />Last Name</label>
<span asp-validation-for="Input.LastName" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<input asp-for="Input.Email" type="email" class="form-control" id="email" name="email" placeholder="Email" style="border-radius: 5px; ">
<label asp-for="Input.Email"><img src="~/images/icons/email_24px.png" />Email address</label>
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
<div class="form-floating mb-3 pb-2">
<input asp-for="Input.Password" type="password" class="form-control" id="password" name="password" placeholder="Password" style="border-radius: 5px;">
<label asp-for="Input.Password"><img src="~/images/icons/password_24px.png" />Password</label>
<span asp-validation-for="Input.Password" class="text-danger"></span>
</div>
<div class="form-floating mb-3 pb-2">
<input asp-for="Input.ConfirmPassword" type="password" class="form-control" id="confirmpassword" name="confirmpassword" placeholder="Confirm Password" style="border-radius: 5px;">
<label asp-for="Input.ConfirmPassword"><img src="~/images/icons/password_24px.png" />Confirm Password</label>
<span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span>
</div>
<div class="form-control mb-3 pb-2">
<label asp-for="Input.Name"></label>
<select asp-for="Input.Name" class="form-control" asp-items='new SelectList((List<IdentityRole>)ViewData["roles"], "Id", "Name")'></select>
<span asp-validation-for="Input.Name" class="text-danger"></span>
</div>
<button class="w-100 btn btn-lg btn-primary " type="submit">Register</button>
<a asp-page="./Login" asp-route-returnUrl="@Model.ReturnUrl" style="text-decoration:none;"><p class="mt-3 mb-2 text-muted ">Already Registered? Login</p></a>
</form>
</div>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
有很多与此类似的问题,但没有一个使用身份或我发现的问题。请帮忙
解决方案
Name
在您的代码中,您的代码中似乎存在冲突Register.chtml
先把to里面的代码public string Name { get; set; }
改一下RegisterModel
[Display(Name = "User Role")]
public string UserRole { get; set; }
然后查看您的代码的这一部分input.Name
和中的名称SelectList
:
<div class="form-control mb-3 pb-2">
<label asp-for="Input.Name"></label>
<select asp-for="Input.Name" class="form-control" asp-items='new SelectList((List<IdentityRole>)ViewData["roles"], "Id", "Name")'></select>
<span asp-validation-for="Input.Name" class="text-danger"></span>
</div>
只需尝试更改为:
<div class="form-control mb-3 pb-2">
<label asp-for="Input.UserRole"></label>
<select asp-for="Input.UserRole" class="form-control" asp-items='new SelectList((List<IdentityRole>)ViewData["roles"], "Id", "Name")'></select>
<span asp-validation-for="Input.UserRole" class="text-danger"></span>
</div>
`
推荐阅读
- path-finding - 益智游戏的探路者
- django - 为什么我收到 TypeError:create_superuser() 缺少 1 个必需的位置参数:AbstractUser 中的“用户名”?
- optimization - Julia:优化具有多个有界参数的函数,而不使用 JuMP 或类似的东西?
- node.js - 多对多关系棱镜
- python - python playsound() 上的错误 259 无法发声
- c# - 在 3D 空间中围绕轴旋转矢量
- sorting - 如何使用 Apollo 和 Graphql 按发布日期(最新的优先)查询我的数据?
- java - 麻烦创建一个抽象的 Vaadin CRM 演示表单类
- c# - 从域外发送 WMI/CIM 请求
- angular - 如何在 wavesurfer.js 音频容器 div 中放置一个图标或将其放置在另一个 div 中并使外部 div 显示为 flex?