You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在RolesController中添加删除方法时遇模型类型不匹配异常求助

问题解决:模型类型不匹配引发的InvalidOperationException异常

问题说明

在RolesController中添加删除方法时,触发如下异常:

InvalidOperationException: 传入ViewDataDictionary的模型项类型为'Microsoft.AspNetCore.Identity.IdentityRole',但该ViewDataDictionary实例要求的模型项类型为'SpaghettiOnline.Models.RoleEdit'

相关代码

RolesController.cs

//Get : Admin/Roles/Delete/id=?
public async Task<IActionResult> Delete(string id)
{
    IdentityRole role = await roleManager.FindByIdAsync(id);

    if (role == null)
    {
        return NotFound();
    }

    return View(role);
}

RoleEdit.cs

public class RoleEdit
{
    public IdentityRole Role { get; set; }

    public IEnumerable<AppUser> Members { get; set; }

    public IEnumerable<AppUser> NonMembers { get; set; }

    public string RoleName { get; set; }

    public string[] AddIds { get; set; }

    public string[] DeleteIds { get; set; }
}

Delete.cshtml

@model RoleEdit

@{
    ViewData["Title"] = "Delete Role";
}

<form asp-action="Delete" method="post">
    <div class="container p-3">
        <div class="border p-3">
            <h1 class="h2 mb-3">Delete Role</h1>
            <hr /><br />

            <input name="RoleName" value="@Model.Role.Name" hidden />
            <div>
                <dl class="row">
                    <dt class="col-sm-2">
                        Role Name
                    </dt>
                    <dd class="col-sm-10">
                        @Model.Role.Name
                    </dd>
                </dl>
            </div>
            <button id="confirm-deletion" type="submit" class="btn btn-danger" style="width:150px">Delete</button>
            <a asp-controller="Categories" asp-action="Index" class="btn btn-light" style="width:150px">
                Back to List
            </a>
        </div>
    </div>
</form>

解决方法

异常根源是视图Delete.cshtml声明的模型类型为RoleEdit,但Controller的Delete方法直接返回了IdentityRole类型对象,两者类型不匹配。

修改RolesController中的Delete方法,创建RoleEdit实例并将查询到的角色赋值给其Role属性,再返回该实例给视图:

//Get : Admin/Roles/Delete/id=?
public async Task<IActionResult> Delete(string id)
{
    IdentityRole role = await roleManager.FindByIdAsync(id);

    if (role == null)
    {
        return NotFound();
    }

    // 构建符合视图要求的模型
    var roleEditModel = new RoleEdit
    {
        Role = role
    };

    return View(roleEditModel);
}

修改后视图将获取到正确类型的模型,可正常渲染页面内容。

内容的提问来源于stack exchange,提问作者Atif Ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:45:33