ASP.NET MVC 2 - HTML. Беспорядок DropDownListFor с 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)%>

и мой Объект модели таким образом:

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', но 'Имя' является ПУСТЫМ. Действительно ли я более обеспечен просто наличие nullable интервала для свойства ParentCategory вместо объекта 'Категории' со строгим контролем типов?

32
задан Scott Baker 25 April 2011 в 20:14
поделиться

2 ответа

У меня тоже возникла та же проблема.

Когда я отлаживаю действие и смотрю, например, на ModelState.Values ​​[1] .Errors [0] .Exception, я вижу следующее:

{"Преобразование параметра из типа 'System.String' в тип 'System.Collections.Generic.KeyValuePair`2 [[System.String, mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089], [System.Int64, mscorlib, Version = 2.0.0.0, Culture = нейтральный, 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")) %>

Он работал без проблем.

Спасибо.

29
ответ дан 27 November 2019 в 20:58
поделиться
<%= Html.DropDownListFor(m => m.ParentCategory, 
                              new SelectList(
                                  Model.Categories,
                                  "CategoryId", 
                                  "Name",
                                  Model.ParentCategory),
                             "[ None ]")%> 

Вы пытались использовать Model.ParentCategory.CategoryId в качестве последнего параметра в SelectList и удалить параметр [None] ?

9
ответ дан 27 November 2019 в 20:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: