通过actionlink发送的列表在控制器中始终为null

时间:2013-03-07 19:47:25

标签: c# asp.net-mvc checkbox

在我的MVC应用程序中,我有一个视图,可以根据布尔属性为列表中的每个项生成复选框。

视图显示没问题。

我希望根据是否选中复选框来获取列表中的所有项目。

第一步是这个actionlink:

<p>
    Send Items: @Html.ActionLink("Click Here", "SendItems")
</p>

这是控制器中编写的方法:

    public ActionResult SendItems(IList<ObjInfo> listToSend)
    {
        m_ListInventoryToSend = new List<ObjInfo>();

        foreach (var item in listToSend.Where(item => item.m_IsSelected))
        {
            m_ListInventoryToSend.Add(item);
        }

        return View(m_ListInventoryToSend);
    }

现在我面临很多问题,因为我正在学习如何编写MVC应用程序,我真的需要你的帮助:

  • 当调试命中方法时,listToSend对象始终为null;
  • 此外,即使值“checked”为true,这些复选框的每个隐藏字段都为false;
  • 如果我将“HttpPost”属性放在方法上,则应用会返回NotFound错误。

谢谢!

1 个答案:

答案 0 :(得分:2)

您无法通过ActionLink发送列表,(除非您执行非常丑陋的查询字符串构建)。

首先,你应该做的是创建一个能够容纳布尔值的模型:

public class MyModel
{
    public List<ObjInfo> Items { get; set; }
}

在视图中设置模型:

@model MyModel

遍历您的模型项以放置一个复选框(必须是for循环才能使模型绑定起作用):

@using (Html.BeginForm("SendItems", "ControllerName")
{ 
    for (int i = 0; i < Model.Items.Count; i++)
    {
        @* Have hidden fors to keep any other data in the class*@
        @HiddenFor(m => m.Items[i].Id)
        @Html.CheckBoxFor(model => model.Items[i].IsChecked)
    }

    <input type="submit" value="Save" />
}

然后,有一个Post方法,如下:

[HttpPost]
public ActionResult SendItems(MyModel model)
{
    foreach (var item in model.Items.Where(item => item.IsSelected))
    {
        m_ListInventoryToSend.Add(item);
    }

    //rest of your post action
}