ASP.NET Core MVC 中 ViewModel 的模型绑定不起作用

问题描述 投票:0回答:1

当我将模型发送回控制器时,模型实例返回时所有属性均为空。

  1. 这是具有一些属性的 ViewModel,包括 SelectList 和模型实例。
 public class ManageUserRolesViewModel
 {
     public PSUser PSUser { get; set; }

     public SelectList Roles { get; set; }

     public string SelectedRole { get; set; }
  
 }
  1. 然后在视图中我有一个数据网格表,我在其中添加了一个带有选择标签的表单,以便用户可以在每行选择一个选项,然后提交表单
<table id="style-3" class="table style-3  table-hover" style="width:100%">
    <thead>
        <tr>
            <th>Name</th>
            <th>Current Role</th>
            <th>New Role</th>
            <th>Manage Role</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>@item.PSUser.FullName</td>
                <td>@(await RolesService.GetUserMainRoleAsync(item.PSUser))</td>
                <td>
                    <form asp-action="ManageUserRoles" asp-controller="UserRoles" method="post">
                    <input type="hidden" asp-for="@item.PSUser" />
                        <div class="flex flex-wrap gap-2 items-center">
                            <select asp-for="@item.SelectedRole" asp-items="@item.Roles" ></select>
                        </div>
                        <input type="submit" class="btn btn-primary" value="Assign Role">
                </form>
                </td>
                <td>
                </td>
            </tr>
        }
    </tbody>
</table>
  1. 在我的 post 方法中,我尝试捕获 ViewModel 对象及其值:
 public async Task<IActionResult> ManageUserRoles(ManageUserRolesViewModel model)
 {
     //do stuff with model

 }

我尝试过将表单标签放在标签之前和之后,还更改了 SelectList 结构,更改了 ViewModel 实例名称,删除了 View 代码并重新创建了它,并阅读了无数关于 ViewModel 绑定的 Stack Overflow 帖子。

我在这里做错了什么?任何帮助将不胜感激!

c# asp.net-mvc asp.net-core model-binding asp.net-mvc-viewmodel
1个回答
0
投票

选择的 name 属性将呈现为 item.SelectedRole:

你可以修改

public async Task<IActionResult> ManageUserRoles(ManageUserRolesViewModel model)
 {
     //do stuff with model

 }

public async Task<IActionResult> ManageUserRoles(ManageUserRolesViewModel item)
 {
     //do stuff with model

 }

此外,您想要在 post 方法中接收的 PUser 的每个属性都必须渲染、修改

<input type="hidden" asp-for="@item.PSUser" />

<input type="hidden" asp-for="@item.PSUser.Id" />
<input type="hidden" asp-for="@item.PSUser.Name" />
......

现在它在我这边起作用了:

您可以查看此文档了解更多详情

© www.soinside.com 2019 - 2024. All rights reserved.