Kyle Sawatsky
Kyle Sawatsky

Reputation: 185

How to bind list of dynamic objects to the Model

I have a strongly typed view where one of the properties of the model that is passed in is a list of objects. I am handling dynamic binding of inputs to this list by using the BeginCollectionItem helper which works fine. However, I also want to initially have a group of inputs visible on the view that will bind to the 'first' object in the list.

I've tried just copying the inputs that BeginCollectionItem generates but that doesn't seem to work.

It generates inputs with name attributes like

invoiceItems[ef43a8f2-c6b7-4791-bf7f-6764c8e3fc9b].Description
invoiceItems[ef43a8f2-c6b7-4791-bf7f-6764c8e3fc9b].Cost

so I manually put 2 inputs on the view with the name attributes

invoiceItems[firstOne].Description 
invoiceItems[firstOne].Cost

but it didn't show up in the model on the controller after submitting the form.

I can't just insert one the BeginCollectionItem way when the view loads because the initial item has to be displayed differently.

Upvotes: 0

Views: 830

Answers (2)

Kyle Sawatsky
Kyle Sawatsky

Reputation: 185

I figured it out. I was on the right track with manually putting in the stuff that BeginCollectionItem did, I was just missing a part. You need another hidden input that tells the binding what the index you're using is.

So the following works perfectly

<input type="hidden" name="invoiceItems.index" autocomplete="off" value="firstOne" />
<input type="text" placeholder = "ex. Labour" id="invoiceItems_firstOne__Description" name="invoiceItems[firstOne].Description" />
<input type="text" placeholder = "ex. $15" id="invoiceItems_firstOne__Cost" name="invoiceItems[firstOne].Cost" />

I just added the top hidden input to what I had before and it's all good.

Upvotes: 0

Mohayemin
Mohayemin

Reputation: 3870

Not exactly answer to your question, but I hope it will solve your problem.

Instead of changing the name in the view, you may try changing the model. Add a boolean property IsFirst. I believe you know in the controller(or wherever the model is being instantiated) which one is first. Set the first items IsFirst to true.

Upvotes: 1

Related Questions