在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
相关产品推荐
相关产品推荐

