sherlock
sherlock

Reputation: 2807

ASP.NET MVC model binding not working with list of items

Part of my view looks like

<table border="1" class="table table-hover">
                    <tr><th>Item</th><th>Description</th><th>Price</th><th>Quantity</th></tr>
                        <tr>
                            <td>Shirt</td>
                            <td>T-Shirt</td>
                            <td>5.0000</td>
                            <td><select class="form-control" id="items_1_" name="items[1]"><option value="">Select quantity</option>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select></td>
                        </tr>
                        <tr>
                            <td>Shirt</td>
                            <td>Full-Sleeve</td>
                            <td>6.0000</td>
                            <td><select class="form-control" id="items_2_" name="items[2]"><option value="">Select quantity</option>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select></td>
                        </tr>
                        <tr>
                            <td>Trousers</td>
                            <td>Half</td>
                            <td>4.0000</td>
                            <td><select class="form-control" id="items_3_" name="items[3]"><option value="">Select quantity</option>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select></td>
                        </tr>
                        <tr>
                            <td>Trousers</td>
                            <td>Full</td>
                            <td>6.0000</td>
                            <td><select class="form-control" id="items_4_" name="items[4]"><option value="">Select quantity</option>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select></td>
                        </tr>
                </table>

My controller looks like

[HttpPost]
public ActionResult RequestLaundry(int laundry, int pickuphour, int pickupminute, int[] items)
{
    var req = Request.Form;
    return View();
}

The data posted to controller from view looks like

{laundry=1&pickuphour=17&pickupminute=16&items%5b1%5d=5&items%5b2%5d=0&items%5b3%5d=1&items%5b4%5d=4}

Though all other model parameters are getting bound with default model binder, items is null. However, the post request looks fine to me. I am using ASP.NET MVC 5.0 with VS2015. Where could the problem be?

Upvotes: 1

Views: 855

Answers (1)

Rusty
Rusty

Reputation: 4473

You are missing items[0]
Array or list is zero based. Model binder is getting confused since it cant find the first item.

You can avoid using numbered indexer at all by using following syntax

name="items[]"

Upvotes: 2

Related Questions