views:

53

answers:

3

I have an object that has a few different List properties that contain child objects.

I'm trying to wrap my head around the best way for the user to select and add these child objects from a New view (where I'm creating a new instance of the parent object).

As an example, suppose I have a Project class and a "New" ViewPage that presents the user with the form to create a new Project. On this form, the user can supply data for the basic properties (no problems there) and then there is an area that allows the user to add ProjectExpense objects to this new Project. For each project expense, the user selects the category of the expense, a line item value, maybe a quantity. When the user wants to add more than one expense, we allow him to do so by providing a nice little jQuery row clone that gives him a new line to work with.

Where I stumble is how to get that data back to the Create action when the form is submitted. Right now, I'm trying to parse through an unknown number of these ProjectExpense rows, which is painful. It seems a better option might be to store the ProjectExpense object in some sort of Session or TempData bag on the server every time they add a line. Then in the action, we grab that bag and attach it to the parent object and persist as normal.

Any thoughts on how others are doing this kind of work?

A: 

One possible solution I found (for other's reference) basically duplicates the form fields the same way I am, but on the form submission (Submit button click), he's calling a method that updates a hidden form field with the appropriate data from the dynamic data.

http://weblogs.asp.net/jacqueseloff/archive/2009/04/17/creating-dynamic-forms-with-mvc-and-jquery.aspx

mannish
A: 

This is off the top of my head and I'm not thinking about AJAX here just a simple server round trip but: why not have two forms on the page?

The first form would post to the 'New' Project action and the second form would post to the create project expense action?

You could potentially put them into partial views for clarity and cleanliness of your models.

If you are creating the expenses before the Project is created then you're right to create a temporary object that isn't persisted to you datastore maybe and only save it when the project is saved, although I'd question if this is the right design decision and have a good think before doing it.

If you are doing this with AJAX then the problem is simpler, you could maintain a JSON representation of the whole object and then post that back to the server for deserialization and processing.

Hope that helps.

Lewis
A: 

You can easily bind these new rows of values to IList. Haacked has a post about such possibility but it's a bit out of date. But there are a lot of useful and up to date information in comments. In my opinion that post describes this possibility much better in comparison with post of jeloff (the link you've provided in comment). So you'll need just to change a JS code which adds a ProjectExpense row to set appropriate names and use IList binding in your controller method. And you'll not need in some custom JS to gather all values and add them to the some hidden field and so on. This feature already works out of box. UPDATE: Just found one more good link about this http://blog.codeville.net/2008/12/22/editing-a-variable-length-list-of-items-in-aspnet-mvc/

zihotki
Sorry for the delay in selecting an answer. Besides my own input, this solution really ended up being the best for my needs. I had some other issues to contend with that made this difficult, but it did highlight some domain concerns I hadn't previously noticed until I started binding in this manner.
mannish