views:

3721

answers:

5

Hello all,

I trying to work out if there is built in support for binding complex types to form elements. To use a common hypothetical situation: I have a Product entity that belongs to a Category - the models look something like this:

    public class Product
    {
        public int ID { get; set; }
        public string Description { get; set; }
        public Category Category { get; set; }
    }
    public class Category
    {
        public int ID { get; set; }
        public string Title { get; set; }
    }

Creating a form to hydrate a new entity that only contains simple value types is nice and simple using the ASP.Net MVC framework eg:

public ActionResult Create(Product product);

But what about the above scenario where your entities contain other complex types. Are there built in mechanisms for Binding a IEnumerable<T> to a drop down list and then automatically hydrating the correct T when the form is submitted?

It would be fairly trivial to do it manually - I'm just trying to ascertain what I can have for free out of the box. :-)

+1  A: 

The closest I think that it will come is overriding the ToString() method in the class to output meaningful information to the DropDownList - but not much else.

You may be able to bind the IEnumerable collection to a DropDownList and then retrieving its SelectedItem when the form is submitted - that is the cheapest way I can think of.

Fritz H
A: 

I haven't yet tried the DefaultModelBinder for complex types, but you could always use MvcContrib's CastleBind (borrowed from the Castle Project) which gives you complex type binding easily, including arrays.

See http://blogger.forgottenskies.com/?p=258

Mauricio Scheffer
+4  A: 

See here and here and here for details about model binding.

zihotki
Yes, I use a complex model binder and these links in this answer are the best place to look so far.
Nick DeVore
A: 

Please check this, as I think that talks about your question, it seems that the S#arp guys have solved it and it's easily "rip"'able if you don't use their stuff.

Anyway I think it's somewhat dangerous to automatically load entities from whatever the user posts... will have to think about it.

Francisco Lozano
A: 

You have to transform you IEnumerable<Product> into an IEnumerable<SelectListItem> and after you pass it to an Html.DropDown, and that's it

Omu