tags:

views:

938

answers:

2

I have a data class that contains a number of fields:

public class Person
{
    public int id { get; set }
    public string Name { get; set; }
    public double Rate { get; set; }
    public int Type { get; set; }
}

If I understand Scott Hanselman's take on binding arrays of objects, I should be able to create a form view that renders HTML that looks like this:

<input name="Person[0].id" value="26" type="hidden" />
<input name="Person[0].Name" value="Tom Smith" type="text" />
<input name="Person[0].Rate" value="40.0" type="text" />
<select name="Person[0].Type">
    <option selected="selected" value="1">Full Time</option>
    <option value="2">Part Time</option>
</select>

<input name="Person[1].id" value="33" type="hidden" />
<input name="Person[1].Name" value="Fred Jones" type="text" />
<input name="Person[1].Rate" value="45.0" type="text" />
<select name="Person[1].Type">
    <option value="1">Full Time</option>
    <option selected="selected" value="2">Part Time</option>
</select>

I should then be able to capture this data in my controller with an action method that looks like this:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult People(Person[] array)
{
    // Do stuff with array
}

But it doesn't work. The array variable is always null. I interpret this as the data binding is not working. But why?

+8  A: 

Your fields should be named array[0].id, array[0].Type, ...

They should have the name of the array instance, not the name of the Type inside the array.

Alternatively you could change the signature of the actioncontroller to: Person[] Person

You get the point :-)

Thomas Stock
Sonofabitch....
Robert Harvey
It took me about 10 seconds of looking at the link you posted.. it's one of those blind spot things that we all know and hate. ;-)
Thomas Stock
+4  A: 
<input name="Person[0].Rate" value="40.0" type="text" />

should be:

<input name="array[0].Rate" value="40.0" type="text" />
Lance Harper
+1 for seeing the same blind spot that Thomas did.
Robert Harvey