5

Khi bạn có đối tượng miền cần hiển thị dưới dạng điều khiển giao diện, như danh sách thả xuống, ifwdev đề xuất tạo phương thức tiện ích mở rộng để thêm .ToSelectList().Làm cách nào để mã hóa phương thức C# Extension để biến đối tượng Mô hình miền thành đối tượng Giao diện?

Đối tượng gốc là Danh sách đối tượng có thuộc tính giống với thuộc tính .Text và .Value của danh sách thả xuống. Về cơ bản, đó là một danh sách các đối tượng SelectList, không phải của cùng một tên lớp.

Tôi tưởng tượng bạn có thể sử dụng phản chiếu để biến đối tượng miền thành đối tượng giao diện. Bất cứ ai có bất cứ lời đề nghị cho mã C# có thể làm điều này? SelectList là một danh sách thả xuống của MVC của SelectListItem.

Ý tưởng tất nhiên là để làm một cái gì đó như thế này trong giao diện:

<%= Html.DropDownList("City", 
     (IEnumerable<SelectListItem>) ViewData["Cities"].ToSelectList()) 
+0

Bằng phản ánh, ý tôi là đọc các thuộc tính của đối tượng nguồn và kết hợp chúng với các tính chất SelectList, trả lại một danh sách lựa chọn DropDownList thích hợp. –

Trả lời

4

Nó dễ dàng hơn để làm cho SelectList một phần của đối tượng ViewModel của bạn.

Dù sao, bạn chỉ cần lặp qua số IEnumerable và thêm từng mục vào đối tượng SelectList mới và trả lại.

public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption) 
{ 
    var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList(); 
    items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" }); 
    return items; 
} 

How to refactor these 2 similar methods into one?

+2

+1 để có dữ liệu danh sách lựa chọn được định dạng trong mô hình chế độ xem. Nó dễ dàng hơn và dễ dàng hơn nhiều để kiểm tra. – Mark

+0

Nếu bạn vui lòng, bạn có liên kết cho mẫu ViewModel không? Chúng ta đang nói về việc tạo một lớp cho mỗi khung nhìn ngoài các mô hình miền? Tôi cho rằng kho lưu trữ sẽ không trả lại bất kỳ thứ gì trong số này, vì vậy bạn có sử dụng các nhà máy để tạo các mô hình xem không? –

+1

Ở đây bạn truy cập: http://nerddinnerbook.s3.amazonaws.com/Part6.htm. ViewModel là một đối tượng lớp chứa tất cả dữ liệu bạn cần để hiển thị khung nhìn (bao gồm các thứ như SelectLists). –

4

Đây là những phương pháp khuyến nông hai tôi sử dụng để tạo chọn danh sách.

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value) 
{ 
    return collection.ToSelectList(text, value, x => false); 
} 

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value, Func<T, bool> selected) 
{ 
    return (from item in collection 
      select new SelectListItem() 
         { 
          Text = text(item), 
          Value = value(item), 
          Selected = selected(item) 
         }); 
} 

HTHs,
Charles

Các vấn đề liên quan