根据选中的复选框将值从MVC View传递到MVC Controller

时间:2017-05-01 00:08:11

标签: c# asp.net-mvc asp.net-mvc-4 razor checkbox

在MVC C#View中我显示了具体员工的记录,因为我使用MVCScaffolding和下面的模型

 public class Developer
    {
        public int code { get; set; }
        public string areaDev { get; set; }
        public string nameDev { get; set; }
        public string expDev { get; set; }
        public string langDev { get; set; }
    }

视图使用剃刀,每个记录都有一个复选框输入

@model IEnumerable<WebApplication1.Models.Developer>

@using(Html.BeginForm("ShowRecords","Home"))
{

<table class="table">
    <tr>
        <th>@Html.DisplayNameFor(model => model.code)</th>
        <th>@Html.DisplayNameFor(model => model.areaDev)</th>
        <th>@Html.DisplayNameFor(model => model.nameDev)</th>
        <th>@Html.DisplayNameFor(model => model.expDev)</th>
        <th>@Html.DisplayNameFor(model => model.langDev)</th>
        <th>select</th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>@Html.DisplayFor(modelItem => item.code)</td>
        <td>@Html.DisplayFor(modelItem => item.areaDev)</td>
        <td>@Html.DisplayFor(modelItem => item.nameDev)</td>
        <td>@Html.DisplayFor(modelItem => item.expDev)</td>
        <td>@Html.DisplayFor(modelItem => item.langDev)</td>
        <td><input type="checkbox" name="code" value="@item.code" /></td>
    </tr>
}
</table>
<input type="submit" value="SEND" />
}

我想要的是当用户点击视图中显示的一个/多个特定记录的复选框时检索代码信息(整数代码),

enter image description here

在我的控制器中,我收到一个int [],如下所示

  public ActionResult ShowRecords(int[] datos)
    {
        {
            foreach(var item in datos)  
            {  ... some code goes here ... }     
            return View(); 
        }

但我从视图中收不到任何内容,总是收到NULL

enter image description here

您可以帮助我并告诉我如何检索控制器中到期检查行的代码信息吗?

编辑: 刚刚添加了isChecked属性

public class Developer
    {
        public int code { get; set; }
        public string areaDev { get; set; }
        public string nameDev { get; set; }
        public string expDev { get; set; }
        public string langDev { get; set; }
        public bool isChecked { get; set; }
    }

向视图发送信息的控制器将新属性设置为false(为了不显示复选框)

while (dr.Read())
                {
                    Models.Developer data = new Models.Developer();
                    data.code = Convert.ToInt32(dr["code"]);
                    data.areaDev = dr["areaDev"].ToString();
                    data.nameDev = dr["nameDev"].ToString();
                    data.expDev = dr["expDev"].ToString();
                    data.langDev = dr["langDev"].ToString();
                    data.isChecked = false;
                    Records.Add(data);
                }

在我的视图中我添加了这个

  @Html.CheckBoxFor(modelItem => item.isChecked)

在控制器中我希望收到一个开发人员模型列表

public ActionResult ShowRecords(List<WebApplication1.Models.Developer> datos)

但仍然接收NULL

3 个答案:

答案 0 :(得分:2)

您生成的name="code"复选框因此您需要POST方法签名

public ActionResult ShowRecords(int[] code)

code参数将包含已选中复选框的值数组。

根据您使用视图模型进行的修改,您的视图需要使用for循环或自定义EditorTemplate,以便正确生成name属性以绑定到集合(请参阅Post an HTML Table to ADO.NET DataTable了解更多详情)

@for (int i = 0; i < Model.Count; i++)
{
    <td>
        @Html.CheckBoxFor(m => m[i].code) // include hidden input so its submitted
        @Html.DisplayFor(m=> m[i].code)
    </td>
    ....
    <td>@Html.CheckBoxFor(m => m[i].isChecked)</td>
}

并且POST方法签名将是

public ActionResult ShowRecords(List<Developer> model)

答案 1 :(得分:0)

将操作的参数更改为IEnumerable<WebApplication1.Models.Developer>,然后检查每个操作的isChecked属性(或者只使用LINQ将其过滤掉)。如果您不喜欢这种方法,可以使用Javascript来返回这些内容。我将指出在使用更多带宽的同时返回模型(因为它将更多数据返回到服务器),但它更符合MVC模式而不是返回整数。

答案 2 :(得分:0)

您可以使用Developper对象和其他isChecked属性创建viewModel。然后修改您的视图以使用:

IEnumerable <DevelopperViewModel>

作为视图的模型并绑定isChecked的值。