ASP.NET MVC 2 - Html.DropDownListFor confusion with ViewModel
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, "Cat开发者_C百科egoryId", "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?
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.
<%= 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?
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)%>
If the SelectList is null in the ViewModel I also received the above error
Make sure that the SelectList is set
精彩评论