Razor View 将错误的 Id 传递给 OnPost 方法

Posted

技术标签:

【中文标题】Razor View 将错误的 Id 传递给 OnPost 方法【英文标题】:Razor View is passing wrong Id to OnPost method 【发布时间】:2021-10-25 19:12:09 【问题描述】:

我正在使用带有 Razor 页面和身份的 Asp.net Core .Net 5 Web 应用程序。 我想为管理员构建一个角色管理器页面,但是在将角色分配给用户时,从视图传递的角色 ID 与我传递到视图的角色 ID 不匹配。 这是我的模型

public class RoleManagerModel : PageModel

    private readonly UserManager<ApplicationUser> _userManager;
    private readonly RoleManager<IdentityRole> _roleManager;

    public RoleManagerModel(UserManager<ApplicationUser> userManager,
        RoleManager<IdentityRole> roleManager)
    
        _userManager = userManager;
        _roleManager = roleManager;
    

    public IEnumerable<ApplicationUser> Users  get; set; 
    public IEnumerable<IdentityRole> Roles  get; set; 


    public ApplicationUser UserToChangeRole  get; set; 
    [BindProperty]
    public IdentityRole RoleToAssign  get; set; 
    public static string FirstID  get; set; 
    public static string SecondId  get; set; 

    public async Task OnGet()
    
        Users = await _userManager.Users.ToListAsync();
        Roles = await _roleManager.Roles.ToListAsync();
        FirstID = Roles.FirstOrDefault(r => r.Name == "Admin").Id;

    

    public async Task<IActionResult> OnPost(string userId)
    
        UserToChangeRole = await _userManager.FindByIdAsync(userId);
        SecondId = RoleToAssign.Id;
        if(FirstID == SecondId)
        
            string Gogo = "true";
        
        var role = await _roleManager.FindByIdAsync(RoleToAssign.Id);
        if (UserToChangeRole == null)
            RedirectToPage("/Identity/NotFound");
        if (await _roleManager.RoleExistsAsync(RoleToAssign.Name))
        
           await  _userManager.AddToRoleAsync(UserToChangeRole, RoleToAssign.Name);
        

        Users = await _userManager.Users.ToListAsync();
        Roles = await _roleManager.Roles.ToListAsync();

        return Page();
    

这是我认为的形式。

 <!--Roles-->
            <td>
                <form method="post">

                    <div class="form-group">
                        <label asp-for="Roles"></label>
                        <select class="form-control" asp-for="RoleToAssign">
                            @foreach (var role in Model.Roles)
                            
                                <option value="@role.Id">@role.Name</option>
                            
                        </select>

                    </div>

                    <button type="submit" class="btn btn-primary btn-sm">Assign</button>
                    <input type="hidden" name="userId" value="@user.Id" />
                </form>

            </td>

正如您在 Post 方法中看到的那样,我会检查传递和接收的 roleIds 是否匹配。他们没有。我究竟做错了什么?有什么建议?谢谢。

【问题讨论】:

你试图从哪里获取 roleId 的代码? 【参考方案1】:

添加到页面模型

 [BindProperty]
 public int RoleToAssignId  get; set; 

并查看

<select class="form-control" asp-for="RoleToAssignId">
 @foreach (var role in Model.Roles)
 
  <option value="@role.Id">@role.Name</option>
 
</select>

【讨论】:

谢谢,这确实有效!只有角色 ID 是字符串。 :),对不起,我不能为你的答案投票,需要提高我的声誉。

以上是关于Razor View 将错误的 Id 传递给 OnPost 方法的主要内容,如果未能解决你的问题,请参考以下文章

将js变量或输入值传递给razor

将数据从 javascript 传递到 asp.net core 2 razor 页面方法

如何将 lambda 传递给 Razor 辅助方法?

将 Razor 模型传递给 Angular 5 组件

将 Razor 语法变量传递给 Html Helper 的 javascript onclick

将变量传递给按钮 vue js laravel