web-dev-qa-db-ja.com

ASP.NET MVC 2-Html.DropDownListViewModelとの混同について

ASP.NET MVC 2.0 R2で新しく強く型付けされたHtml.DropDownListForヘルパーを使用する方法について完全に迷って混乱しています

私が書いているビューでは:

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

これで動作します。 ViewModelのParentCategoryプロパティに正しい「CategoryId」が設定されていますが、「Name」はNULLです。強く型付けされた 'Category'オブジェクトの代わりに、ParentCategoryプロパティにnullable intを持たせた方が良いでしょうか?

32
Sunday Ironfoot

私も同じ問題を経験していました。

たとえば、アクションをデバッグし、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 = 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")) %>

問題なく機能しました。

ありがとうございました。

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

SelectListの最後のパラメーターとしてModel.ParentCategory.CategoryIdを使用し、[None]パラメーターを削除しようとしましたか?

9
Edmon

私は取り除くだろう

public Category ParentCategory { get; set; }

そして作る

public int? CategoryId { get; set; }

代わりに。おそらく、とにかくIdのみが必要です-Idをキーとして使用して、実際のオブジェクトを常に検索できます(リストのlinq/lambdaを使用して)。

ビューには次の2つがあります。

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

<%= Html.ValidationMessageFor(m => m.CategoryId)%>

SelectModelがViewModelでnullの場合、上記のエラーも受け取りました

SelectListが設定されていることを確認してください

1
Gertjan