32

tôi nhận được hoàn toàn bị mất và lẫn lộn về cách sử dụng mạnh mẽ gõ Html.DropDownListFor helper mới về ASP.NET MVC 2.0 R2ASP.NET MVC 2 - Html.DropDownListFor nhầm lẫn với ViewModel

Trong Xem tôi 'm writting:

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

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

và đối tượng mẫu của tôi là như sau:

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

vấn đề là khi tôi chọn một mục từ danh sách thả xuống, nói mục đầu tiên, tôi nhận được Valida sau Lỗi tionMessageFor "Giá trị '1' không hợp lệ."

Vì vậy, tôi thay đổi Xem để ...

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

Bây giờ nó hoạt động, kinda. Thuộc tính ParentCategory trong ViewModel của tôi được đặt với 'CategoryId' chính xác nhưng 'Name' là NULL. Tôi có tốt hơn off chỉ có một int nullable cho ParentCategory bất động sản thay vì một mạnh mẽ gõ 'Thể loại' đối tượng?

+0

Đây là một cách tốt để người dùng DropDownListFor - http://stackoverflow.com/questions/3386998/dropdownlistfor-display-a-simple-list-of-strings – bcahill

Trả lời

29

Tôi cũng gặp phải sự cố tương tự.

Khi tôi gỡ lỗi Action và nhìn vào ModelState.Values ​​[1] .Errors [0] .Exception ví dụ, tôi thấy như sau:

{ "Các tham số chuyển đổi từ loại 'System.String' gõ 'System.Collections.Generic.KeyValuePair`2 [[System.String, mscorlib, Phiên bản = 2.0.0.0, Văn bản = trung lập, PublicKeyToken = b77a5c561934e089], [System.Int64, mscorlib, Version = 2.0.0.0, Culture = trung lập, PublicKeyToken = b77a5c561934e089]] 'thất bại vì không có trình chuyển đổi kiểu nào có thể chuyển đổi giữa các loại này. "} System.Exception {System.InvalidOperationException}

Trong trường hợp của tôi, SelectList của tôi được tạo từ một từ điển và tôi sử dụng nó trong chế độ xem:

<%=Html.DropDownListFor(x => x.MyDictionary, 
          new SelectList(
           Model.MyDictionary, 
           "Value", 
           "Key")) %> 

Khi tôi thay đổi nó để:

<%=Html.DropDownListFor(x => x.MyDictionary.Keys, // <-- changed to .Keys 
          new SelectList(
           Model.MyDictionary, 
           "Value", 
           "Key")) %> 

Nó làm việc mà không vấn đề.

Cảm ơn bạn.

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

Cậu cố gắng sử dụng Model.ParentCategory.CategoryId như một tham số cuối cùng trong SelectList và loại bỏ [None] tham số?

+0

sẽ không thay thế "[None]" bằng CategoryId chỉ thay đổi mặc định/ban đầu giá trị của danh sách thả xuống chứ không phải giá trị trong chế độ xem mô hình trên postback? Trước đây là một downvote nhưng tôi đã lấy nó trở lại trong một sự phù hợp của sự không chắc chắn sau khi nhận ra có lẽ là một quá tải khác nhau. Bạn có thể làm rõ một chút được không? –

8

tôi sẽ thoát khỏi

public Category ParentCategory { get; set; } 

và thực hiện một

public int? CategoryId { get; set; } 

để thay thế. Bạn có thể chỉ cần bất kỳ Id anyways - bạn luôn có thể tra cứu đối tượng thực sự bằng cách sử dụng Id làm khóa (sử dụng linq/lambda trong danh sách của bạn trong trường hợp của bạn).

Quan điểm sau đó sẽ có những hai:

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

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

Nếu SelectList là null trong ViewModel Tôi cũng đã nhận được báo lỗi trên

Hãy chắc chắn rằng SelectList được thiết lập