Подтвердить что ты не робот

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?

4b9b3361

Ответ 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 установлен