将列表从视图传递到控制器MVC3

时间:2015-03-12 14:07:40

标签: forms list asp.net-mvc-3 post

经过深入搜索,我无法找到任何解决方案。 我有一个Ajax.BeginForm需要传递一个包含已检查行信息的列表。

UnitsChecked Class(Model)

public class UnitsChecked
{
    public bool IsChecked { get; set; }
    public TaxiTV.Data.Entity.Unit Unit { get; set; }
}

ReportsVM(查看模型类)

public class ReportsVM 
{
    public IEnumerable<UnitsChecked> UnitList { get; set; }
    public ReportsVM()
    {
         UnitList = new List<UnitsChecked>();
    }
}

Index.cshtml(查看)

@using (Ajax.BeginForm("GetReports", "Reports", new AjaxOptions { UpdateTargetId = "ReportList", LoadingElementId = "loader" })) 
{
    <table class="tableBorder">
        <tr>
            <th>Choose
            </th>
            <th>
                @Resources.IMEI
            </th>
            <th>
                @Resources.SIM
            </th>
            <th>
                @Resources.Name
            </th>
        </tr>
        @for (int i = 0; i < Model.UnitList.Count(); i++ )
        {
            <tr>
                <td>
                    @Html.CheckBoxFor(m => m.UnitList.ElementAt(i).IsChecked, new { @class = "checkboxListener" })
                </td>
                <td>
                    @Html.DisplayFor(m=> m.UnitList.ElementAt(i).Unit.IMEI)
                    @Html.Hidden("zzz", Model.UnitList.ElementAt(i)) <---- This line
                </td>
                <td>
                    @Model.UnitList.ElementAt(i).Unit.SIM
                </td>
                <td>
                    @Model.UnitList.ElementAt(i).Unit.Person.FirstName @Model.UnitList.ElementAt(i).Unit.Person.LastName
                </td>
            </tr>
        }
    </table>
}

主要且最重要的一行是箭头指向的位置。 使用Fiddler2我设法看到所有UnitsChecked列表都是逐个发送的。 以下控制器说&#34; zzz&#34;是空的。

[HttpPost]
        public ActionResult GetReports(ReportsVM rvm, List<UnitsChecked> zzz)
    {

有什么建议吗? 谢谢。

1 个答案:

答案 0 :(得分:0)

您需要将属性UnitList更改为typeof IList<UnitsChecked>,然后在视图中

@for (int i = 0; i < Model.UnitList.Count; i++ )
{
  @Html.CheckBoxFor(m => m.UnitList[i].IsChecked, new { @class = "checkboxListener" })
  @Html.DisplayFor(m=> m.UnitList.[i].Unit.IMEI)
  @Html.HiddenFor(m=> m.UnitList.[i].Unit.SomeProperty) // for any properties of Unit that you want posted back
}

这将使用索引器正确地命名控件,以便它们可以绑定到集合,即

<input type="checkbox" name="UnitList[0].IsChecked" .. value="True" />
<input type="hidden" name="UnitList[0].IsChecked" .. value="False" />
<input type="checkbox" name="UnitList[1].IsChecked" .. value="True" />
<input type="hidden" name="UnitList[1].IsChecked" .. value="False" />

您当前使用的.ElementAt(i)正在为控件提供重复的id属性(无效的html)和name属性(因此无法绑定到集合)。

您的控制器需要只是

[HttpPost]
public ActionResult GetReports(ReportsVM rvm)