C# 当我不';t按顺序选择复选框
当我试图在Post中获取值时,当我不按顺序(1、2、3等)进行检查时,复选框的值被设置为NULL 我需要不按顺序选择其中任何一个(即4、5) 型号:C# 当我不';t按顺序选择复选框,c#,asp.net-mvc,razor,visual-studio-2013,asp.net-mvc-5,C#,Asp.net Mvc,Razor,Visual Studio 2013,Asp.net Mvc 5,当我试图在Post中获取值时,当我不按顺序(1、2、3等)进行检查时,复选框的值被设置为NULL 我需要不按顺序选择其中任何一个(即4、5) 型号: public class AssignUsersViewModel { [Display(Name = "Check to select")] public bool Select { get; set; } public int Id { get; set; } [Display(Name = "App. Us
public class AssignUsersViewModel
{
[Display(Name = "Check to select")]
public bool Select { get; set; }
public int Id { get; set; }
[Display(Name = "App. Username")]
public string UserName { get; set; }
[Required]
public string GivenName { get; set; }
[Required]
public string Surname { get; set; }
[Display(Name = "Roles")]
public IList<Roles> Roles { get; set; }
}
public class AssignUsersAddModel
{
public bool Select { get; set; }
public int Id { get; set; }
public IEnumerable<SelectedRoles> selectedRoles { get; set; }
}
public class SelectedRoles
{
public string Name { get; set; }
}
发送项目。selectedRoles为空
我怎么能做到这一点呢?我发现IEnumerable不按顺序工作(好消息) 我将复选框的名称更改为:
- name=“[@i.ToString()]”。selectedRoles.name“
- HttpContext.Request.Params[“[1].selectedRoles.Name”]
到目前为止,我没有其他想法,但它对我有效。。。我只需要在name属性中限制逗号。DefaultModelBinder将仅绑定集合项的索引器从零开始且连续的集合。问题是您正在手动创建一个checkbox元素。由于未选中的复选框不会回发,因此如果取消选中一个复选框,则在提交时它和任何后续复选框值都不会绑定到集合 接下来,您将尝试将复选框绑定到
字符串
值。复选框有两种状态,用于表示布尔值
您尚未显示角色
(视图)模型,但它应该包含一个布尔属性,指示是否已选中该属性
public class Role
{
public int ID { get; set; }
public string Name { get; set; }
public bool IsSelected { get; set; }
}
然后在视图中,使用强类型html帮助程序,以便获得正确的双向模型绑定
@for (int j = 0; j < Model[i].Roles.Count; j++)
{
@Html.HiddenFor(m => m[i].Roles[j].Name) // or better use the ID property
@Html.CheckBoxFor(m => m[i].Roles[j].IsSelected)
@Html.LabelFor(m => m[i].Roles[j].IsSelected, Model[i].Roles[j].Name)
}
非ListAssignUsersAddModel>model
好的公认答案-这是关于复选框和绑定的附加说明
如果查看
复选框的输出,您将看到字段有两个输入,例如:
@Html.CheckBoxFor(x=>x.Flag)
给予
对于这个问题,我肯定会按照公认的答案重构并使用Html助手
在其他情况下,复选框可以通过javascript动态添加,因此上面隐藏的输入字段是一种方法。您可能应该使用Html.CheckboxFor,或者至少通过Html.NameFor获得名称,而不是像您这样复杂的混乱。如果您按照[@i.ToString()]的思路进行操作,则可能会出现这种情况。selectedRoles[].Name,以便将每个值添加到列表的末尾,您只需循环查看您拥有的值?Robert,复选框仅适用于布尔值。如果值为角色名,则不起作用。谢谢我会尝试使用Ilist或List,但我不确定……完美而完整的解决方案Stephen,我被炒了,效果非常好。事实上我用的是角色。Id是我需要的。
public class Role
{
public int ID { get; set; }
public string Name { get; set; }
public bool IsSelected { get; set; }
}
@for (int j = 0; j < Model[i].Roles.Count; j++)
{
@Html.HiddenFor(m => m[i].Roles[j].Name) // or better use the ID property
@Html.CheckBoxFor(m => m[i].Roles[j].IsSelected)
@Html.LabelFor(m => m[i].Roles[j].IsSelected, Model[i].Roles[j].Name)
}
List<string> selectedRoles = model.Roles.Where(r => r.IsSelected);
public ActionResult UsersAddToApp(List<AssignUsersViewModel> model)
@Html.CheckBoxFor(x=>x.Flag)
<input type='checkbox' name='Flag' .. // value etc based existing value
<input type='hidden' name='Flag' value='false' /> // always false
<input type="checkbox" name="[@i.ToString()].selectedRoles[@j.ToString()].Name" value="@Model[i].Roles[j].Name" class="checkbox-inline" />
<input type="hidden" name="[@i.ToString()].selectedRoles[@j.ToString()].Name" value="@Model[i].Roles[j].Name" value='false' />