如何使用Html.BeginForm获取控制器中的对象列表?

时间:2016-02-03 14:21:51

标签: c# asp.net-mvc razor controller html.beginform

我在向控制器发送对象列表时遇到问题。出于某种原因,我不断得到一个count = 0的列表。

这是我发送的模型:

public class DIYViewModel
{

    public List<Item> Items { get; set; }
    public List<CheckModel> Checklist { get; set; }
    public int Page { get; set; }
    public int TotalPages { get; set; }
    public DIYViewModel(int page, List<Item> items,List<CheckModel> checklist)
    {
        int index = (page - 1) * 10;
        this.Items = items.Skip(index).Take(10).ToList();
        this.Page = page;
        this.TotalPages = ((items.Count - 1) / 10) + 1;
        this.Checklist = checklist;
    }
}

这是CheckModel:

public class CheckModel
{
    public int Id
    {
        get;
        set;
    }
    public string Name
    {
        get;
        set;
    }
    public bool Checked
    {
        get;
        set;
    }
}

这是获取DIYViewModel的视图:

@model Homeserve.Web.Models.DIYViewModel
@using Sitecore.Data.Items
@using Homeserve.Web.Models.Helpers
@using (Html.BeginForm("Testing", "DIY", new {  app=Model.Checklist }))
{
foreach (CheckModel item in Model.Checklist)
{
    @Html.HiddenFor(it => item.Id)
    @Html.DisplayFor(it => item.Name)
    @Html.CheckBoxFor(it => item.Checked)
}
<input id="Submit1" type="submit" value="submit" />
}
@{
foreach (Item newsItem in Model.Items)
{
    <p> @Html.Sitecore().Field("Article Title", newsItem)</p>
    <p> @Html.Sitecore().Field("Article Date", newsItem)</p>
    <p> @Html.Sitecore().Field("Contents", newsItem)</p>
    <p> @Html.Sitecore().Field("Article Image", newsItem)</p>
    <p>social media stuff here</p>
}
}
@Html.DIYsPagination(Model.Page, Model.TotalPages)

我的控制器:

[HttpPost]
public ActionResult Testing(List<CheckModel> app)
{
    return View();
}

列表应用程序始终是一个包含0个项目的列表,即使在视图中一切正常。

1 个答案:

答案 0 :(得分:1)

您必须使用for循环而不是foreach,并使用index来保存数据。

@for (int i = 0; i < Model.Checklist.Count ;i++)
{
    @Html.DisplayFor(it => it.Checklist[i].Name)
    @Html.HiddenFor(it =>  it.Checklist[i].Id)
    @Html.CheckBoxFor(it =>  it.Checklist[i].Checked)
}