ASP.NET Core MVC中Roles视图无法访问关联Staffs实体属性如何解决
问题根源
你定义的Roles实体类中Staffs属性是ICollection<Staffs>集合类型,代表一个角色对应多个员工,属于一对多关系里的"多"端集合,自然不能直接调用单个Staffs对象才有的FirstName属性。反过来Staffs实体里的Role是单个Roles对象,属于一对多里的"一"端,所以可以直接访问Role的属性。
你当前控制器里用Include(s => s.Staffs)预加载关联数据的逻辑是正确的,不需要修改。
解决方法
根据你实际的展示需求,选择对应方案即可:
场景1:显示当前角色下所有员工的信息
在视图中嵌套一层循环遍历Staffs集合即可,修改视图的<tbody>部分代码如下:
<tbody> @foreach (var role in Model) { <!-- 判断当前角色有没有关联员工 --> if (role.Staffs.Any()) { foreach (var staff in role.Staffs) { <tr> <td> @Html.DisplayFor(_ => role.Id) / @Html.DisplayFor(_ => role.Name) </td> <td> @Html.DisplayFor(_ => staff.FirstName) @Html.DisplayFor(_ => staff.LastName) </td> <td> <a asp-action="Edit" asp-route-id="@role.Id">Edit</a> | <a asp-action="Details" asp-route-id="@role.Id">Details</a> | <a asp-action="Delete" asp-route-id="@role.Id">Delete</a> </td> </tr> } } else { <!-- 没有关联员工的角色单独显示 --> <tr> <td> @Html.DisplayFor(_ => role.Id) / @Html.DisplayFor(_ => role.Name) </td> <td> 暂无关联员工 </td> <td> <a asp-action="Edit" asp-route-id="@role.Id">Edit</a> | <a asp-action="Details" asp-route-id="@role.Id">Details</a> | <a asp-action="Delete" asp-route-id="@role.Id">Delete</a> </td> </tr> } } </tbody>
场景2:仅显示当前角色下第一个员工的信息
如果只需要取集合中第一个员工的属性,需要先取集合中的单个对象,同时做空值判断避免空引用异常:
<td> @* 取第一个员工的FirstName,没有员工则显示空 *@ @Html.DisplayFor(_ => role.Staffs.FirstOrDefault()?.FirstName) </td>
内容的提问来源于stack exchange,提问作者Ritcus
相关产品推荐
相关产品推荐

