【问题标题】:Unable to Bind Multiple Generated Html.DropDownListFor to ViewModel无法将多个生成的 Html.DropDownListFor 绑定到 ViewModel
【发布时间】:2019-05-23 18:24:08
【问题描述】:

这是我的第一篇文章!如果我搞砸了这个过程,请提前道歉,并感谢您的阅读。

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

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

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

问题: 提交表单时,我无法将下拉列表中的选定项目绑定到视图模型。为每个用户正确创建下拉列表,并为每个用户预先选择最后存储的Permission。但是当提交表单时,接收到的视图模型就像一个新创建的对象,没有真正的值。 我觉得我忽略了一些非常简单的事情。

控制器:

[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; }

}

查看:

    @using (Html.BeginForm(actionName: "EditPermissions", controllerName: "Device", method: FormMethod.Post))
    {
    <table>
            @{
                    foreach (var User in Model.Users)
                    {
                            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 == User.UserId).PermissionId, selectList, htmlAttributes: null)

                                    </td>
                            </tr>

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

【问题讨论】:

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


    【解决方案1】:

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

    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" />
    

    }

    【讨论】:

    • 这对我不起作用。调试显示 accessLevel.AccessLevelId 和 Model.AccessLevels[index].AccessLevelId 都具有相同的值。
    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2016-05-04
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多