Jihad Mezouari
Jihad Mezouari

Reputation: 43

send a ViewModel which contains a list with a Html.BeginForm (MVC 4)

My viewmodel contains a integer list, the problem I have is that when I send my modified form viewmodel, it is always equal to null.

My ViewModel :

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

Action in my Controller :

For example, I'll try to sum ​​the new values ​​entered into the form, but the sum calculated is always equal to 0, nothing changes.

      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 });
    }

My view

  @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" />
  }

Thank you kindly help me

Upvotes: 4

Views: 9730

Answers (3)

Khalid Abuhakmeh
Khalid Abuhakmeh

Reputation: 10839

You need to index each item in your collection. The issue with your code seems to be the use of foreach. You really want to use for instead and pass in the index with the EditorFor call.

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

This only works for ordered lists that will never change their order. If you want to reorder items I suggest your read Phil Haack's great post on sending lists to the server.

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

Upvotes: 4

maxs87
maxs87

Reputation: 2284

list binding

<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
}

Upvotes: 3

Rumi P.
Rumi P.

Reputation: 1737

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

Looks like you are filling your int array with zeroes instead of i's. This should read montest.itemTest.Add(i); .

Upvotes: 1

Related Questions