ASP.NET MVC 2 - Html.DropDownList Для путаницы с ViewModel
Я полностью теряюсь и смущен тем, как использовать новый строго типизированный Html.DropDownListFor помощник на ASP.NET MVC 2.0 R2
В представлении, которое я пишу:
<%= Html.DropDownListFor(m => m.ParentCategory, new SelectList(Model.Categories, "CategoryId", "Name", Model.ParentCategory), "[ None ]")%>
<%= Html.ValidationMessageFor(m => m.ParentCategory)%>
и мой объект Model таким образом:
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; }
}
}
Проблема заключается в том, что когда я выбираю элемент из раскрывающегося списка, скажем, первый элемент, я получаю следующую ошибку ValidationMessageFor "Значение" 1 "неверно."
Итак, я меняю вид на...
<%= Html.DropDownListFor(m => m.ParentCategory.**CategoryId**,
new SelectList .../ snip ) %>
Теперь это работает, любопытно. Свойство ParentCategory в моей модели ViewModel задано с правильным "CategoryId", но "Name" имеет значение NULL. Мне лучше просто иметь значение null для свойства ParentCategory вместо строго типизированного объекта Category?
Ответы
Ответ 1
У меня также была проблема с тем же.
Когда я отлаживаю действие и смотрю на ModelState.Values [1].Errors [0]. Исключение, например, я вижу следующее:
{ "Преобразование параметров из типа" System.String "для типа" 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]] 'не удалось, потому что конвертер типа не может конвертировать между этими типами. "} System.Exception {System.InvalidOperationException}
В моем сценарии мой SelectList создается из Словаря, и я использую это в своем представлении:
<%=Html.DropDownListFor(x => x.MyDictionary,
new SelectList(
Model.MyDictionary,
"Value",
"Key")) %>
Когда я изменил его на:
<%=Html.DropDownListFor(x => x.MyDictionary.Keys, // <-- changed to .Keys
new SelectList(
Model.MyDictionary,
"Value",
"Key")) %>
Он работал без проблем.
Спасибо.
Ответ 2
<%= Html.DropDownListFor(m => m.ParentCategory,
new SelectList(
Model.Categories,
"CategoryId",
"Name",
Model.ParentCategory),
"[ None ]")%>
Вы пытались использовать Model.ParentCategory.CategoryId
в качестве последнего параметра в SelectList
и удалите параметр [None]
?
Ответ 3
Я бы избавился от
public Category ParentCategory { get; set; }
и сделайте
public int? CategoryId { get; set; }
вместо этого. Вам, вероятно, нужен только Id, вы всегда можете найти фактический объект, используя ключ Id (используя linq/lambda в вашем списке в вашем случае).
В представлении будут следующие два:
<%= Html.DropDownListFor(m => m.CategoryId,
new SelectList(
Model.Categories,
"CategoryId",
"Name",
Model.CategoryId),
"[ None ]")%>
<%= Html.ValidationMessageFor(m => m.CategoryId)%>
Ответ 4
Если SelectList имеет значение null в ViewModel, я также получил указанную выше ошибку
Убедитесь, что SelectList установлен