[英]Unable to Bind Multiple Generated Html.DropDownListFor to ViewModel
这是我的第一篇文章! 如果我搞砸了这个过程,请提前道歉,并感谢您的阅读。
我正在MVC中创建一个管理工具,允许用户映射一些数据类型的关联。 我希望用户使用动态创建的下拉列表控件选择数据的关联方式。
数据类型:我使用了四种数据类型(我已经更改了类型名称以使其更具相关性,但原理是相同的)。 数据类型: DeviceType
, UserType
和PermissionSet
是非常基本的普通旧CLR对象。 对于DeviceType
和UserType
每个组合,都需要有一个关联的PermissionSet
。 关联将保存在第四种数据类型DeviceUserPermissions
,类似于桥接表,并映射到数据库中的一种。
场景:此方案在用户选择了特定的DeviceType
,现在指向编辑页面,在该页面中,他们可以选择要应用于每个UserType
PermissionSet
。 因此,将列出每个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" />
}
使用index将值绑定到dropdownlist
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" />
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.