Thursday, March 31, 2011

ASP.NET MVC: Binding a Complex Type to a Select

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. :-)

From stackoverflow
  • 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.

  • 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

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

    Nick DeVore : Yes, I use a complex model binder and these links in this answer are the best place to look so far.
  • 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.

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

0 comments:

Post a Comment