Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我不';t按顺序选择复选框_C#_Asp.net Mvc_Razor_Visual Studio 2013_Asp.net Mvc 5 - Fatal编程技术网

C# 当我不';t按顺序选择复选框

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

当我试图在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. 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' />