mvc使用checkboxfor模型未回发

时间:2016-04-26 14:09:54

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

我在构建一个包含复选框列表的表单时使用了CheckboxFor:

                            <div id="TestSections">
                            @foreach (var item in Model)
                            {
                                <div class="form-group">
                                    <label class="col-md-2 control-label">
                                        @if (item.IsRequried)
                                        {
                                            <text>Required - </text>
                                        }
                                        @item.Name
                                    </label>
                                    <div class="md-checkbox-list col-md-10">
                                        <div>
                                            @Html.CheckBoxFor(i => item.IsChecked)
                                        </div>
                                    </div>
                                </div>
                            }
                        </div>

传递的模型是:

    public class TestModel
{
    public int TestId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public bool IsRequired { get; set; }
    // used for checkbox
    public bool IsChecked { get; set; }
}

该视图构建了正确的复选框,但在表单发回时我无法获取它们:

        [HttpPost]
    public ActionResult TestSection(int id, List<TestModel> model)
    {
        return View();
    }

模型始终为空。

3 个答案:

答案 0 :(得分:3)

这是因为你使用foreach作为List模型。 尝试重写如下:

for(int i=0;i<Model.Count;++i)
{
    @Html.CheckBoxFor(model => model[i].IsChecked)
}

答案 1 :(得分:3)

我有一段相似的问题。从列表中显示项目的方式与通常的方式略有不同。您现在将拥有for loop并使用索引变量访问列表中的每个项目。需要索引,以便您可以跟踪哪个复选框设置为true,哪个是false。

在您的视图中,您可以使用以下代码:

@model List<TestModel>

@using (Html.BeginForm())
{
     @for (int i = 0; i < Model.Count; i++)
     {
          <div>@Html.CheckBoxFor(m => m[i].IsChecked)</div>
     }
}

我试图像你那样改变它,但是没有测试过它:

<div id="TestSections">
     @for (int i = 0; i < Model.Count; i++)
     {
          <div class="form-group">
               <label class="col-md-2 control-label">
                    @if (item.IsRequried)
                    {
                         <text>Required - </text>
                    }
                    @item.Name
               </label>
               <div class="md-checkbox-list col-md-10">
                    <div>
                         @Html.CheckBoxFor(i => i[i].IsChecked)
                    </div>
               </div>
          </div>
     }
</div>

在您的控制器中,您的操作方法将如下所示:

public ActionResult TestSection(int id)
{
     List<TestModel> models = new List<TestModel>();
     // Populate your list and send it to the view

     return View(models);
}

[HttpPost]
public ActionResult TestSection(int id, List<TestModel> model)
{
     // Do what ever you need to do
     return View();
}

我希望这会有所帮助。

答案 2 :(得分:0)

如果您正在使用列表

模型列表绑定

   int i =0;
    @foreach (var item in Model)
    {
        @Html.CheckBox("myModel["+i+"].IsChecked",item.IsChecked)
        i++;
    }