Это мой первый пост!Заранее извиняюсь, если я испортил этот процесс, и спасибо за чтение.
Я делаю инструмент администратора в 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" />
}