2010-01-22 3 views
5

Tôi có một lớp ViewModel có chứa một từ điển (và những thứ không liên quan khác cho câu hỏi này):ASP.NET MVC 1.0 - Mô hình chất kết dính cho Từ điển

public class MyViewModel { 
    public Dictionary<int, string> Data { get; set; } 
    /* ... */ 
} 

Sau đó, tôi có một vài GET/POST hành động đối phó với từ điển. Hành động GET đầu tiên sẽ lấp đầy Dictionary<int, string> với một số dữ liệu từ cơ sở dữ liệu, và sau đó trả về một View:

  • các .Key s sẽ được lĩnh vực tiềm ẩn; và
  • số .Value s sẽ ở trên textareas để người dùng chỉnh sửa.

Sau đó, người dùng sẽ gửi biểu mẫu này, gọi hành động POST. Nó sẽ cố gắng xử lý đầu vào (quá trình này không liên quan). Một số cặp Key/Value sẽ là hợp lệ, một số sẽ là không hợp lệ.

Nếu có cặp không hợp lệ, hành động POST sau đó sẽ tái tạo lại một ViewModel , nhưng lần này các từ điển nên chỉ chứa không hợp lệ cặp, và sẽ hiển thị lại cùng Xem cho người sử dụng để sửa chữa và thử gửi lại .

Câu hỏi: cách đơn giản nhất để đạt được điều này là gì?

Những gì tôi đã cho đến nay (làm việc tốt), trong bộ điều khiển:

public ActionResult MyAction(MyViewModel vm) { 
    /* Process data */ 
    if (are there invalid pairs?) { 
     var vmErrors = new MyViewModel(); 
     /* ... fill the ViewModel ... */ 
     vmErrors.Data = 
      vm.Data 
       .Where(x => IsInvalid(x)) 
       .ToDictionary(x => x.Key, x => x.Value); 
     return View(vmErrors); 
    } 
} 

Và quan điểm:

<% var i = 0; foreach (var p in Model.Data) { %> 
    <%= Html.Hidden("vm.Data[" + i + "].key", vm.Key %> 
    <%= Html.TextArea("vm.Data[" + i + "].value", vm.Value %> 
<% i++; } %> 

Vấn đề là rằng để làm hài lòng những model binder tôi phải đặt tên các trường của tôi trên chế độ xem có id tuần tự. Nhưng tôi cũng phải lặp lại từ điển để trích xuất các cặp khóa/giá trị, vì vậy nó không thể là vòng lặp for (var i = 0; i < Model.Data.Count; i++) {...}.

+0

Bạn đang sử dụng ASP.NET MVC 1.0 hoặc MVC 2? Mô hình ràng buộc của bộ sưu tập và từ điển đã được cải thiện đáng kể trong MVC 2. – Eilon

+0

@Eilon: ASP.NET MVC 1.0, và phải gắn bó với nó. –

Trả lời

1

Các giải pháp được mô tả trong bài viết này - Dictionary Model Binder in ASP.NET MVC2 and MVC3

Mã này là có mục đích chung và có thể được sử dụng với MVC 1 quá.

+0

Thật đáng tiếc là không ai trả lời trong một năm. :( –