选中复选框MVC5

时间:2017-06-08 13:20:52

标签: asp.net asp.net-mvc

我搜索了一些文章,但没有一个符合我的问题。我在我的cshtml中有这个代码

@model IEnumerable<MonitoreoIntegrado.Models.Sensores>
@using (Html.BeginForm("Graphics", "Datos_extensometro", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <div style="margin:0; padding:0; border:none; position:absolute; bottom:5px; right:25px;"><input type="submit" id="enviar" class="btn btn-primary" value="Consultar"></div>
    <div style="float:left; width:428px; height:105px; padding:5px; overflow-y: scroll;">
        <h4 style="margin-top:0px;">Consultar multiples sensores</h4>
            @foreach (var item in Model)
            {
                @Html.CheckBox("sensoresCB", false, new { value = @item.idSensor.ToString() }) @item.nombre <a class="moverse" objetivo="@(item.idSensor)" href=""><span class="glyphicon glyphicon-map-marker" title="Ir al marcador"></span></a><br />
            }
    </div>
}

这在我的控制器中:

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = RolesSistema.Administrador + "," + RolesSistema.Lectura)]
public ActionResult Graphics()
{
    return View();
}

我需要帮助才能在我的控制器中接收复选框并检查哪些复选框

4 个答案:

答案 0 :(得分:1)

您应该为输入使用唯一ID。最简单的方法:

@for (var i = 0; i < Model.Count(); i++)
{
    @Html.CheckBox("sensoresCB["+i.ToString()+"]", false, new { value = Model[i].idSensor.ToString() })
    //your other stuff
}

在控制器方面:

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = RolesSistema.Administrador + "," + RolesSistema.Lectura)]
public ActionResult Graphics(bool[] sensoresCB) //note this
{
    return View();
}

所以你得到了你选择的数组。使用索引来理解它是什么复选框。

答案 1 :(得分:1)

您可以使用item属性或类似内容扩展Checked的模型。

public class GraphicsViewModel {
   public GraphicsItemViewModel[] Items { get; set; }
}

public class GraphicsItemViewModel {
   public bool Checked { get; set; }
   public long IdSensor { get; set; }
}

然后,您可以使用对此Checked属性的绑定来呈现复选框。

@model GraphicsViewModel 
@using (Html.BeginForm(/* ....*/) {
    // use a for loop so the array is bound correctly
    @for (int i = 0; i < Model.Items.Length; i++) { 
       @Html.CheckBoxFor(m => m.Items[i].Checked)
       // post back IdSensor value so we can access it in the controller
       @Html.HiddenFor(m => m.Items[i].IdSensor) 
    }
}

您的控制器应该接受POST数据的模型,您可以重用ViewModel:

[HttpPost]
public ActionResult Graphics(GraphicsViewModel postData) {
  bool areAllChecked = postData.Items.All(i => i.Checked);
  bool isFirstChecked = postData.Items.First().Checked;
  bool isCertainIdChecked = postData.Items.Single(i => i.IdSensor == 1337).Checked;
  // ...
}

答案 2 :(得分:0)

我想在这里提一个有用的观点,那就是

  

如果选中复选框,则回发值将包含a   形式为[InputName] = [InputValue]

的键值对      

如果未选中复选框,则发布的表单不包含   完全参考复选框。

因此,在控制器操作方法中,您可以使用复选框的名称并获取仅检查的值

例如:

public ActionResult Graphics(bool[] sensoresCB) 
{
    return View();
}

希望以上信息有用

由于

KARTHIK

答案 3 :(得分:0)

基于@teo van kot回复,我实现了恢复复选框值。这是我的工作代码。

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = RolesSistema.Administrador + "," + RolesSistema.Lectura)]
public ActionResult Graphics(int[] sensoresCB)//you can receive a string[] as well
{
    //code and stuff
    return View();
}

查看:

@model IEnumerable<MonitoreoIntegrado.Models.Sensores>
@using (Html.BeginForm("Graphics", "Datos_extensometro", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    //some code stuff
    @{
        int i = 0;
        foreach (var item in Model)
        {
            @Html.CheckBox("sensoresCB[" + i.ToString() + "]", false, new { value = item.idSensor.ToString() }) @item.nombre<br />
            i++;
        }
    }
}