.net core 验证失败:InvalidRoleName

.net core 验证失败:InvalidRoleName,.net-core,asp.net-core-mvc,asp.net-core-3.1,.net Core,Asp.net Core Mvc,Asp.net Core 3.1,我对代码有一些问题。我无法创建角色。代码对我来说似乎很好,但我找不到错误。通过WriteLine,我得到了以下信息: Microsoft.AspNetCore.Identity.RoleManager: Warning: Role 38676182-f211-47d7-b69b-f190e4338123 validation failed: InvalidRoleName. 为什么InvalidRoleName无效?这只是一根绳子。感谢您的帮助 c#: 使用系统; 使用System.Colle

我对代码有一些问题。我无法创建角色。代码对我来说似乎很好,但我找不到错误。通过WriteLine,我得到了以下信息:

Microsoft.AspNetCore.Identity.RoleManager: Warning: Role 38676182-f211-47d7-b69b-f190e4338123 validation failed: InvalidRoleName.
为什么InvalidRoleName无效?这只是一根绳子。感谢您的帮助

c#:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Identity;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.AspNetCore.Mvc.RazorPages;
名称空间Sarpinos.Pages.Admin
{
公共类CreateRoleModel:PageModel
{
专用只读角色管理器(RoleManager);
公共CreateRoleModel(RoleManager RoleManager)
{
_roleManager=roleManager;
}
[BindProperty]
公共列表角色{get;set;}
公共互联网
{
}
公共异步任务OnPost()
{
if(ModelState.IsValid)
{
var newRole=newidentityrole();
newRole.Id=Guid.NewGuid().ToString();
wait_roleManager.CreateAsync(newRole);
WriteLine($“{newRole.Id}{newRole.Name}”);
}
返回至Topage(“仪表板”);
}
}
}
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>
@page
@模型Sarpinos.Pages.Admin.CreateRoleModel
@{
ViewData[“标题”]=“寄存器”;
}
角色名称:
创造
[BindProperty]
公共列表角色{get;set;}
公共互联网
{
}
公共异步任务OnPost()
{
if(ModelState.IsValid)
{
var newRole=newidentityrole();
newRole.Id=Guid.NewGuid().ToString();
wait_roleManager.CreateAsync(newRole);
WriteLine($“{newRole.Id}{newRole.Name}”);
}
返回至Topage(“仪表板”);
}
根据您的描述,您似乎想要创建一个新角色,但通过使用上述代码,您似乎正在使用
列表
来显示角色,并且在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");
    }
}
公共类CreateRoleModel:PageModel
{
专用只读角色管理器(RoleManager);
公共CreateRoleModel(RoleManager RoleManager){{u RoleManager=RoleManager;}
公共类新角色
{
公共字符串RoleName{get;set;}
}
[BindProperty]
公共NewRole输入{get;set;}
公共互联网
{
输入=新角色()//
}
公共异步任务OnPostAsync()
{
if(ModelState.IsValid)
{
var newRole=newidentityrole();
newRole.Id=Guid.NewGuid().ToString();
newRole.Name=Input.RoleName;
wait_roleManager.CreateAsync(newRole);
WriteLine($“{newRole.Id}{newRole.Name}”);
}
返回Topage(“主页/索引”);
}
}
然后,在CreateRole.cshtml页面中,根据NewRole类插入一个新角色(您可以将名称空间更改为您的名称空间)

@page
@addTagHelper*,Microsoft.AspNetCore.Mvc.TagHelpers
@模型标识Sample.Pages.CreateRoleModel
@Html.AntiForgeryToken()
角色名称:
创造

您是否传递了
newRole.Name
从这里我看到,您正在声明一个新的
new IdentityRole()
,没有RoleName。这就是为什么它不能通过验证,因为名称不应该为null或空。尝试添加
newRole.Name=“ANY\u ROLE\u Name”
newRole.Id=Guid.NewGuid().ToString()之后。您可能还需要将表单POST中的角色名称传递到
的“ANY\u role\u name”
。新角色名称应该从POST表单中填写。我修复了这个问题,在cshtml输入中添加了'name=“name”和c#var theName=Request.Form[“name”];newRole.Name=名称;虽然我不确定为什么绑定没有按预期工作。我怀疑绑定没有按预期工作,因为您绑定的是
列表
而不是
IdentityRole
,因为
应该只为一个值而不是多个值。
    [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");
    }
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");
    }
}
@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>