我有一个表单来添加一个新用户,其中包含几个用户角色复选框。我的操作中有一个名为 User 的模型,它具有以下属性:

public string Username { get; set; }
public string Password { get; set; }
public IEnumerable<UserRole> Roles { get; set; }

在 UserRole 类中,我有两个属性:
public int Id { get; set; }
public string Name { get; set; }

在我的表单中,通过提供输入名称“用户名”和“密码”,我可以成功地绑定(bind)到用户名和密码。当页面最初加载时,会加载用户角色详细信息,因此我需要传回的只是 Id,因为这是服务将用户与用户角色相关联所需的信息。

我想我可以通过为每个复选框指定角色 Id 的值并将其传递给 Roles 从而部分完成角色类并将角色对象的 Name 字段留空来以简单的方式完成此操作。示例复选框如下所示:
<input type="checkbox" id="addUserAdministrator" name="Roles.Id" value="@Model.Roles.Where(role => role.Name == "Administrator").Select(role => role.Id).First()" class="css-checkbox"/>

但是,这永远不会填充 Roles 集合,并且它始终为 null。有没有办法做到这一点,或者我需要做冗长的方式来传递整数列表并在操作中创建模型?

编辑:

我的 Action 是这样的:
public RedirectToRouteResult Add(User user)

最佳答案

您可以绑定(bind)原始类型的集合 - 在您的情况下为 int

 public IList<Int> Roles { get; set; } //role id's here

使用
<input type="checkbox" id="addUserAdministrator" name="Roles"

或者,如果您想要 Roles 集合,则应明确指定集合的​​索引。阅读 this article 。最好使用非顺序索引(例如,使用 Guid.NewGuid())以防表单列表中选定项目之间存在间隙。
<input type="hidden" name="Roles.Index" value="@(GuidIndexForThisRow)" />
<input type="checkbox" name="Roles[@(GuidIndexForThisRow)].Id" value="1" />

关于c# - ASP.NET MVC : Model binding half an object,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15930103/

10-13 07:12