发送一个ViewModel,其中包含一个带有Html.BeginForm的列表(MVC 4)

时间:2013-06-10 12:08:08

标签: asp.net-mvc viewmodel html.beginform

我的viewmodel包含一个整数列表,我遇到的问题是当我发送修改后的表单viewmodel时,它总是等于null。

我的ViewModel:

public class testViewModel
 {
    public List<int> itemTest { get; set; 
 }

我的控制器中的操作:

  

例如,我将尝试对输入到表单中的新值求和,但计算的总和始终等于0,没有任何变化。

      public ActionResult form(int nbre)
    {
        testViewModel montest = new testViewModel()
        {
            itemTest = new List<int>()
        };

        for(int i=0;i<nbre ;i++)
        {
           montest.itemTest.Add(0);
        }
        return View(montest);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult form(testViewModel maListe)
    {
        int somme = 0;
        if (maListe.itemTest != null)
        {
            if (maListe.itemTest.Count() != 0)
            {

                foreach (var item in maListe.itemTest)
                {
                    somme += item;
                }
            }
        }

        //listtest = maListe;
        return RedirectToAction("test2", new { qte = somme });
    }

我的观点

  @model MvcWebRole1.ViewModels.testViewModel
  @{
     ViewBag.Title = "Formulaire";
   }

  @using (Html.BeginForm())
  {
     @Html.AntiForgeryToken()
     @Html.ValidationSummary(true)
  <table>
  @foreach (var item in Model.itemTest)
  {
    <tr >
       <td >
         @Html.Label("Quantitée")
       </td>
       <td>
        @Html.EditorFor(model => item)
        @Html.ValidationMessageFor(model => item)
       </td>
    </tr>

  }
 </table>
   <input type="submit" value="Valider" />
  }

谢谢你,帮助我

3 个答案:

答案 0 :(得分:4)

您需要为集合中的每个项目编制索引。您的代码问题似乎是使用 foreach 。您确实希望使用代替并使用 EditorFor 调用传入索引。

 for (int i = 0; i < Model.Items.Count; i++) {
    @Html.EditorFor(m => m.Items[i])
 }

这仅适用于永远不会更改订单的有序列表。如果您想重新排序项目,我建议您阅读Phil Haack关于向服务器发送列表的精彩帖子。

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

答案 1 :(得分:3)

列表绑定

<form>
@for(int i=0;i<Model.itemTest.Count ;i++)
{
    @Html.TextBoxFor(x=>x.itemTest[i])
    //or just <input type="text" name="itemTest "/> working to
}

答案 2 :(得分:1)

 for(int i=0;i<nbre ;i++)
        {
           montest.itemTest.Add(0);
        }
        return View(montest);

看起来你用零填充你的int数组而不是。这应该是montest.itemTest.Add(i);