32

Я получаю полностью потерянным и запутанным о том, как использовать новый сильно типизированных помощник Html.DropDownListFor на ASP.NET MVC 2.0 R2ASP.NET MVC 2 - Html.DropDownListFor путаница с ViewModel

В View I «м сочинительство:

<%= 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; } 
    } 
} 

проблема заключается в том, что при выборе элемента из списка, скажем, первый пункт, я получаю следующее Валида msgstr "Значение" 1 "неверно."

Так что я изменить его ...

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

Теперь он работает, своего рода. Свойство ParentCategory в моей модели ViewModel задано с правильным «CategoryId», но «Name» имеет значение NULL. Мне лучше просто иметь значение null для свойства ParentCategory вместо строго типизированного объекта Category?

+0

Это хороший способ для пользователя DropDownListFor - http://stackoverflow.com/questions/3386998/dropdownlistfor-display-a-simple-list-of-strings – bcahill

ответ

29

У меня также была такая же проблема.

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

{ "Преобразование параметров из '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 = нейтраль, 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")) %> 

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

спасибо.

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

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

+0

не заменит «[Нет]» в CategoryId, только изменив значение по умолчанию/начальное значение выпадающего списка, а не значение в представлении модель по обратной передаче? Раньше был downvote, но я взял его обратно в припадке неопределенности, поняв, что, возможно, другая перегрузка. Вы можете немного уточнить? –

8

Я бы избавиться от

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)%> 
1

Если SelectList является недействительным в ViewModel я также получил вышеуказанную ошибку

Убедитесь, что SelectList установлен

Смежные вопросы