ASP.NET MVC 2 - Html.DropDownListFor confusion with ViewModel

75,645

Solution 1

I was also experiencing the same issue.

When I debug the Action and look at the ModelState.Values[1].Errors[0].Exception for example, I see the following:

{"The parameter conversion from type 'System.String' to type 'System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int64, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' failed because no type converter can convert between these types."} System.Exception {System.InvalidOperationException}

In my scenario, my SelectList is created from a Dictionary and i use this in my view:

<%=Html.DropDownListFor(x => x.MyDictionary, 
                             new SelectList(
                                 Model.MyDictionary, 
                                 "Value", 
                                 "Key")) %>

When I changed it to:

<%=Html.DropDownListFor(x => x.MyDictionary.Keys, // <-- changed to .Keys
                             new SelectList(
                                 Model.MyDictionary, 
                                 "Value", 
                                 "Key")) %>

It worked without issues.

Thank you.

Solution 2

<%= Html.DropDownListFor(m => m.ParentCategory, 
                              new SelectList(
                                  Model.Categories,
                                  "CategoryId", 
                                  "Name",
                                  Model.ParentCategory),
                             "[ None ]")%> 

Did you try to use Model.ParentCategory.CategoryId as a last parameter in SelectList and remove [None] parameter?

Solution 3

I would get rid of

public Category ParentCategory { get; set; }

and make a

public int? CategoryId { get; set; }

instead. You probably only need the Id anyways - you could always look up the actual object using the Id as key (using a linq/lambda on your list in your case).

The view will then have these two:

<%= Html.DropDownListFor(m => m.CategoryId, 
                              new SelectList(
                                  Model.Categories, 
                                  "CategoryId", 
                                  "Name", 
                                  Model.CategoryId), 
                              "[ None ]")%>

<%= Html.ValidationMessageFor(m => m.CategoryId)%>

Solution 4

If the SelectList is null in the ViewModel I also received the above error

Make sure that the SelectList is set

Share:
75,645
Sunday Ironfoot
Author by

Sunday Ironfoot

ASP.NET MVC software developer. Just started getting to grips with NHibernate, Unit testing, SOLID, IOC containers etc.

Updated on December 01, 2020

Comments

  • Sunday Ironfoot
    Sunday Ironfoot over 3 years

    I'm getting totally lost and confused on how to use the new strongly typed Html.DropDownListFor helper on ASP.NET MVC 2.0 R2

    In the View I'm writting:

    <%= Html.DropDownListFor(m => m.ParentCategory, new SelectList(Model.Categories, "CategoryId", "Name", Model.ParentCategory), "[ None ]")%>
    
    <%= Html.ValidationMessageFor(m => m.ParentCategory)%>
    

    and my Model object is thus:

    public class CategoryForm : FormModelBase
    {
        public CategoryForm()
        {
            Categories = new List<Category>();
    
            Categories.Add(new CategoryForm.Category() {
                               CategoryId = 1, 
                               Name = "CPUs" });
            Categories.Add(new CategoryForm.Category() { 
                               CategoryId = 2, 
                               Name = "Memory" });
            Categories.Add(new CategoryForm.Category() { 
                               CategoryId = 3, 
                               Name = "Hard drives" });
        }
    
        // ...other props, snip... //
    
        public Category ParentCategory { get; set; }
    
        public IList<Category> Categories { get; protected set; }
    
        public class Category
        {
            public int? CategoryId { get; set; }
            public string Name { get; set; }
        }
    }
    

    The problem is that when I select an item from the dropdown list, say the first item, I get the following ValidationMessageFor error "The value '1' is invalid."

    So I change the View to...

    <%= Html.DropDownListFor(m => m.ParentCategory.**CategoryId**, 
                                  new SelectList .../ snip  ) %>
    

    Now it works, kinda. The ParentCategory property in my ViewModel is set with the correct 'CategoryId' but the 'Name' is NULL. Am I better off just having a nullable int for ParentCategory property instead of a strongly typed 'Category' object?