3

我有一个表单来添加一个带有一些用户角色复选框的新用户。我的操作中有一个名为 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; }

在我的表单中,我可以通过输入名称“用户名”和“密码”成功地绑定到用户名和密码。当页面最初加载时,用户角色详细信息已加载,因此我需要传回的只是 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"/>

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

编辑:

我的动作是这样的:

public RedirectToRouteResult Add(User user)
4

2 回答 2

3

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

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

使用

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

或者,如果您想要 Roles 集合,您应该明确指定集合的​​索引。阅读这篇文章。最好使用非顺序索引(例如使用 Guid.NewGuid()),以防表单列表中的选定项目之间存在间隙。

<input type="hidden" name="Roles.Index" value="@(GuidIndexForThisRow)" />
<input type="checkbox" name="Roles[@(GuidIndexForThisRow)].Id" value="1" />
于 2013-04-10T15:40:12.797 回答
0

当我将 Collections 与 Razor 一起使用时,我会这样解决:我使用 for 块创建一个新的复选框、文本框或任何你想用集合索引显示的东西,因为当你调用控制器方法时,模型会绑定你的基于索引的集合值。

试试这个: 1. 在您的角色 ViewModel 中创建一个布尔字段,以了解何时选择了角色。

@Html.TextBoxFor(model => model.Username)
@Html.PasswordBoxFor(model => model.Password, new { value = Model.Password })

<ul id="roles">
@for (int I = 0; I < Model.Roles.Count(); ++I)
{
    <li>
        @Html.HiddenFor(model => Model.Roles[I].ID)
        @Html.CheckBoxFor(model => Model.Roles[I].RoleSelected)
        @Model.Roles[I].Name
    </li>
}
</ul>

尝试这样的事情。

于 2013-04-10T15:56:16.890 回答