首页 > 解决方案 > 验证失败:InvalidRoleName

问题描述

我的代码有一些问题。我无法创建角色。该代码对我来说似乎很好,但我无法找到错误。使用 WriteLine 我收到以下消息:

Microsoft.AspNetCore.Identity.RoleManager: Warning: Role 38676182-f211-47d7-b69b-f190e4338123 validation failed: InvalidRoleName.

为什么 InvalidRoleName 无效?这只是一个字符串。任何帮助表示赞赏。

C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace Sarpinos.Pages.Admin
{
    public class CreateRoleModel : PageModel
    {
        private readonly RoleManager<IdentityRole> _roleManager;
        public CreateRoleModel(RoleManager<IdentityRole> roleManager)
        {
            _roleManager = roleManager;
        }

        [BindProperty]
        public List<IdentityRole> Roles { get; set; }
        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost()
        {
            if (ModelState.IsValid)
            {
                var newRole = new IdentityRole();
                newRole.Id = Guid.NewGuid().ToString();
                await _roleManager.CreateAsync(newRole);
                Console.WriteLine($"{newRole.Id} {newRole.Name}");
            }

            return RedirectToPage("Dashboard");
        }
    }
}

cshtml:

@page
@model Sarpinos.Pages.Admin.CreateRoleModel
@{
    ViewData["Title"] = "Register";
}


<div class="container">
    <form asp-page="CreateRole" method="POST">
        <div class="form-group">
            <label asp-for="@Model.Roles">Role name:</label>
            <input type="text" asp-for="@Model.Roles" class="form-control" placeholder="Enter role name" />
            <span asp-validation-for="@Model.Roles" class="text-danger"></span>
        </div>
        <button type="submit" class="btn btn-success">Create</button>
    </form>

</div>

标签: .net-coreasp.net-core-mvcasp.net-core-3.1

解决方案


    [BindProperty]
    public List<IdentityRole> Roles { get; set; }
    public void OnGet()
    {
    }

    public async Task<IActionResult> OnPost()
    {
        if (ModelState.IsValid)
        {
            var newRole = new IdentityRole();
            newRole.Id = Guid.NewGuid().ToString();
            await _roleManager.CreateAsync(newRole);
            Console.WriteLine($"{newRole.Id} {newRole.Name}");
        }

        return RedirectToPage("Dashboard");
    }

根据您的描述,您似乎想创建一个新角色,但是通过使用上面的代码,您似乎正在使用 aList<IdentityRole>来显示角色,并且在 post 方法中,您没有为角色设置角色名称新角色。因此,它可能会导致问题。

要创建新角色,在 CreateRoleModel 中,您可以创建一个包含角色相关属性的新类。例如:

public class CreateRoleModel : PageModel
{
    private readonly RoleManager<IdentityRole> _roleManager;

    public CreateRoleModel(RoleManager<IdentityRole> roleManager) { _roleManager = roleManager; }
    public class NewRole
    {
        public string RoleName { get; set; }
    }
    [BindProperty]
    public NewRole Input { get; set; } 

    public void OnGet()
    {
        Input = new NewRole(); //
    }

    public async Task<IActionResult> OnPostAsync()
    {
        if (ModelState.IsValid)
        {
            var newRole = new IdentityRole();
            newRole.Id = Guid.NewGuid().ToString();
            newRole.Name = Input.RoleName;
            await _roleManager.CreateAsync(newRole);
            Console.WriteLine($"{newRole.Id} {newRole.Name}");
        }

        return RedirectToPage("Home/Index");
    }
}

然后,在 CreateRole.cshtml 页面中,基于 NewRole 类插入一个新角色(您可以将命名空间更改为您的)。

@page

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model IdentitySample.Pages.CreateRoleModel

<div class="container">
    <form method="POST">
        @Html.AntiForgeryToken()
        <div class="form-group">
            <label asp-for="@Model.Input.RoleName">Role name:</label>
            <input asp-for="@Model.Input.RoleName" class="form-control" placeholder="Enter role name" />
            <span asp-validation-for="@Model.Input.RoleName" class="text-danger"></span>
        </div>
        <button type="submit" class="btn btn-success">Create</button>
    </form>

</div>

推荐阅读