首页 > 解决方案 > 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" />
}

有很多与此类似的问题,但没有一个使用身份或我发现的问题。请帮忙

标签: asp.netasp.net-mvcasp.net-core

解决方案


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>

`


推荐阅读