无法将多个生成的Html.DropDownListFor绑定到ViewModel

时间:2019-05-23 18:24:08

标签: c# .net razor model-view-controller html.dropdownlistfor

这是我的第一篇文章!如果我已经破坏了流程,请提前致歉,并感谢您的阅读。

我正在MVC中制作一个管理工具,以允许用户映射几种数据类型的关联。我希望用户选择如何使用动态创建的下拉列表控件关联数据。

数据类型: 我正在使用四种数据类型(我更改了类型名称以使其更具关联性,但是原理是相同的)。数据类型:DeviceTypeUserTypePermissionSet是非常基本的普通CLR对象。对于DeviceTypeUserType的每种组合,都需要有一个关联的PermissionSet。关联将保留在第四种数据类型DeviceUserPermissions中,就像桥表一样,并映射到数据库中的一种。

场景: 在用户选择了特定的DeviceType之后出现了这种情况,现在该用户被定向到编辑页面,他们可以在其中选择要应用于每个PermissionSet的{​​{1}}。因此,每个UserType都会被列出,并有一个下拉列表为该UserType选择一个PermissionSet。用户应该能够保存关联,并且下次加载页面时,这些下拉列表的默认选定项应反映该保存的数据。

问题: 提交表单时,我无法从下拉列表中选择要绑定到视图模型的项目。可以为每个用户正确创建下拉列表,并为每个用户预选择最后存储的UserType。但是,当提交表单时,接收到的视图模型就像一个新创建的对象,没有实际值。 我觉得自己正在忽略一些非常简单的内容。

控制器:

Permission

ViewModel:

[HttpGet]
public ActionResult EditPermissions(int deviceId)
{
        var viewModel = new EditDeviceViewModel();

        viewModel.Permissions = _permissionDataAccess.GetAll().ToList();
        viewModel.Users = _userDataAccess.GetAll().ToList();
        viewModel.DeviceUsersPermissions = _deviceUserPermissionDataAccess.GetByDeviceId(deviceId);

        viewModel.DeviceId = deviceId;
        return View(viewModel);
}

// When form is submitted, 'model' is empty as if newly created 
[HttpPost]
public ActionResult Editpermissions(EditDeviceViewModel model)
{
        foreach (var deviceUser in model.DeviceUsers)
        {
                _DeviceUserDataAccess.UpdateDeviceUser(deviceUser);
        }
        return View();
}

查看:

public class EditDeviceViewModel
{
        public EditDeviceViewModel()
        {
                Users = new List<User>();
                SelectedDeviceUserPermissionss = new List<DeviceUserPermissions>();
        }

        public int DeviceId { get; set; }
        public List<User> Users { get; set; }
        public List<Permission> Permissions { get; set; }
        public IEnumerable<DeviceUserPermissions> DeviceUserPermissionss { get; set; }
        public List<DeviceUserPermissions> SelectedDeviceUserPermissionss { get; set; }

}

1 个答案:

答案 0 :(得分:0)

使用索引将值绑定到下拉列表

int index = -1
@using (Html.BeginForm(actionName: "EditPermissions", controllerName: "Device", method: FormMethod.Post))
{
<table>
    @{
    foreach (var User in Model.Users)
    {
    index++
    var deviceUserPermission = Model.DeviceUserPermissions.FirstOrDefault(x => x.UserId == User.UserId) ?? new
    RulesEngine.DAL.DeviceUserPermission()
    { UserId = User.UserId, DeviceId = Model.DeviceId, PermissionId = 0 };

    var selectList = new List<SelectListItem>();
        foreach (var permission in Model.Permissions)
        {
        selectList.Add(new SelectListItem() { Text = permission.PermissionName, Value = permission.PermissionId,
        Selected = (permission.PermissionId == deviceUserPermission.PermissionId) });
        }

        <tr>
            <td>
                @User.Description
            </td>
            <td>
                @Html.DropDownListFor(m => m.SelectedDeviceUserPermissions.FirstOrDefault(x => x.UserId ==
                Model.Users[index].UserId).PermissionId, selectList, htmlAttributes: null)

            </td>
        </tr>

        }
        }
</table>
<input type="submit" value="Save" />

}