2013-04-10 138 views
3

我有一个表格中添加一个新用户与用户角色少数几个复选框。我有我的行动称为用户的模型,其具有以下特性:ASP.NET MVC:模型绑定半对象

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的价值和传递,在与角色,因此部分完成角色类和离开作用对象空白的名称字段该做的简单方法。一个例子复选框看起来像这样:

<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) 
+0

您是否使用了表单集合来检索复选框中的值 – 2013-04-10 15:29:06

+0

我已更新我的问题,我正在尝试绑定到该对象 – Serberuss 2013-04-10 15:31:22

+0

该操作需要用户对象,但您似乎正在传递角色,可以你张贴整个表单代码? – nik0lias 2013-04-10 15:38:19

回答

3

要么你可以绑定原始类型的集合 - 使用

<input type="checkbox" id="addUserAdministrator" name="Roles" 
你的情况

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

INT

或者如果你想要Roles集合,你应该明确地为你的集合指定一个索引。阅读this article。如果表格中列表中选定项目之间出现空白,最好使用非顺序索引(例如,使用Guid.NewGuid())。

<input type="hidden" name="Roles.Index" value="@(GuidIndexForThisRow)" /> 
<input type="checkbox" name="Roles[@(GuidIndexForThisRow)].Id" value="1" /> 
+0

我试过了你的第二个建议,但是当我选择了2个或多个复选框并提交了这些时,问题就出现了,只有一个(第一个)绑定到对象 – Serberuss 2013-04-10 15:48:31

+0

你为每对隐藏的\复选框使用不同的guid?它应该是相同的成对,但在成对之间是唯一的。 – lavrik 2013-04-10 15:49:59

+0

我甚至无法使用隐藏/复选框对的GUID绑定到角色。如果我明确将名称设置为角色[0] .Id,但它将始终为空,那么它会绑定。 – Serberuss 2013-04-10 16:01:03

0

当我使用集合剃刀,我解决这个问题的方法:我使用的块创建任何你想要的集合的索引中显示一个新的复选框,文本框或,因为当你调用控制器方法,该模型将绑定基于索引的Collection值。

试试这个: 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> 

尝试类似这样的东西。

+0

我不确定这会对我有效,因为我有一个初始加载数据的模型和一个将数据传递给动作的不同模型,因为这些模型有不同的信息 – Serberuss 2013-04-10 16:05:02

+0

这种方式将绑定您的视图根据角色集合。无论您将值放入初始化中或更改此值,该循环都会显示您当前的内容。 – Kiwanax 2013-04-10 16:31:32