Невозможно привязать несколько сгенерированных Html.DropDownListFor к ViewModel - PullRequest
0 голосов
/ 23 мая 2019

Это мой первый пост!Заранее извиняюсь, если я испортил этот процесс, и спасибо за чтение.

Я делаю инструмент администратора в MVC, чтобы позволить пользователю отображать ассоциации нескольких типов данных.Я хочу, чтобы пользователь выбрал способ привязки данных с помощью динамически создаваемых элементов управления раскрывающегося списка.

Типы данных: я использую четыре типа данных (я изменил имена типов, чтобы сделать их более связанными, но принцип тот же).Типы данных: DeviceType, UserType и PermissionSet - довольно простые простые старые объекты CLR.Для каждой комбинации DeviceType и UserType должен быть связан PermissionSet.Связи будут храниться в четвертом типе данных, DeviceUserPermissions, который похож на таблицу мостов, и сопоставляется с ним в базе данных.

Сценарий: этот сценарий происходит после того, как пользователь выбрал конкретный DeviceTypeи теперь направляется на страницу редактирования, где они могут выбрать, какой PermissionSet применить к каждому UserType.Таким образом, каждый UserType будет в списке и иметь выпадающий список для выбора PermissionSet для этого UserType.Пользователь должен иметь возможность сохранять ассоциации, и при следующей загрузке страницы выбранные по умолчанию элементы для этих раскрывающихся списков должны отражать эти сохраненные данные.

Проблема: я не могу получить выбранные элементы враскрывающиеся списки для привязки к модели представления при отправке формы.Раскрывающиеся списки создаются правильно для каждого пользователя, и последний сохраненный 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();
}

ViewModel:

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

1 Ответ

0 голосов
/ 23 мая 2019

Использование индекса для привязки значения к выпадающему списку

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

}

...