2010-02-08 32 views
5

Tôi chỉ tự hỏi mọi người đang tạo ra SelectList của họ - trong hành động hoặc chế độ xem.ASP.net MVC: Tạo SelectList trong chế độ xem hoặc hành động?

Tôi đã xem các ví dụ về cả hai và ý nghĩa nhất đối với tôi là thực hiện nó trong hành động và có mô hình xem có thuộc tính SelectList loại. Mặt khác, tôi đã thấy các ví dụ trong đó mọi người có mô hình xem có một thuộc tính của SelectList và SelectList được điền trong mô hình khung nhìn (hoặc trong hàm dựng hoặc thông qua tải chậm). Tôi thích ý tưởng này vì điều đó có nghĩa là có ít mã trong hành động của tôi ...

Tóm lại, tôi đã tự hỏi mọi người đang làm gì.

Cheers Anthony

Trả lời

5

Tạo SelectList của bạn trong bộ điều khiển (bằng cách nhìn lên danh sách các mặt hàng từ kho lưu trữ mô hình của bạn), và vượt qua nó để xem như một trong hai đối tượng ViewData, hoặc như là một phần của bạn mạnh mẽ, đánh máy ViewModel.

+0

Tại sao? Tôi rất vui khi được thăng cấp nếu bạn cung cấp thêm một số chi tiết về lý do tại sao bạn cho rằng cách tiếp cận này là thích hợp hơn. Nó có dễ kiểm tra hơn không? Quảng cáo sử dụng lại mã? Phân tách mối quan tâm tốt hơn? –

+0

@Seth: Mục đích của đối tượng ViewModel được đánh máy mạnh là gói tất cả dữ liệu được yêu cầu bởi chế độ xem để hiển thị chính xác. Trong trường hợp này, vì một trình đơn thả xuống yêu cầu một danh sách các mục, nên thích hợp để đưa nó vào đối tượng ViewModel. Lập trình viên đến sau tôi sẽ thấy SelectList trong ViewModel, và kết luận rằng nó đang được sử dụng để cư trú một dropdown trong khung nhìn. Và anh ta không phải tìm đâu khác. –

+0

@Robert: Tôi hoàn toàn đồng ý với bạn.Quan điểm của tôi là câu trả lời của bạn đã được chọn là câu trả lời "đúng" và tôi nghĩ rằng một số thông tin bổ sung có thể hữu ích cho người nào đó gặp phải câu hỏi này trong tương lai. Tôi muốn các lập trình viên MVC mới biết _why_ điều này là thích hợp hơn, thay vì mù quáng theo một câu trả lời SO :) –

1

Tôi thường tạo SelectList của mình trong lớp hành động hoặc dịch vụ và chuyển nó đến chế độ xem của tôi qua Chế độ xem. Tôi cũng đã biến nó trở thành một phần của mô hình xem và chế độ xem được nhập mạnh mẽ. Cả hai cách tạo ra nó trong lớp hành động hoặc dịch vụ mặc dù.

+0

Việc truyền các SelectLists thông qua ViewData là OK, nhưng nếu trang của bạn được gõ mạnh vào đối tượng ViewModel, thì nó sạch hơn chỉ để bao gồm các SelectLists của bạn như một phần của ViewModel –

+0

đã đồng ý, và đó là những gì tôi làm nếu cần gửi nhiều dữ liệu hơn cho chế độ xem hơn là danh sách lựa chọn.Nếu tất cả những gì tôi cần là danh sách lựa chọn thì tôi có xu hướng sử dụng ViewDat a. –

1

Tôi có SelectList được hiển thị dưới dạng thuộc tính trong mô hình chế độ xem và điền nó vào hành động bằng cách sử dụng kho lưu trữ cần thiết. Tôi nghĩ rằng mã tương tác trực tiếp với các kho lưu trữ nên là một trong đó cũng chịu trách nhiệm với populating, có thể là hành động điều khiển hoặc lớp dịch vụ hoặc bất cứ điều gì khác.

Tôi không nghĩ rằng việc điền danh sách trực tiếp từ mô hình xem là một ý tưởng hay, vì nó sẽ yêu cầu mô hình xem có sự phụ thuộc kho lưu trữ và thực hiện tương tác cơ sở dữ liệu và mô hình khung không chịu trách nhiệm cho loại này của mọi thứ. Bạn cũng có thể tạo một đối tượng đặc biệt riêng biệt, được gọi là Trình khởi tạo hoặc một cái gì đó tương tự, có tất cả các populating và khởi tạo, nếu bạn có nhiều trường SelectList và muốn giữ mã hành động của bạn sạch hơn.

+0

"Tôi không nghĩ rằng việc đưa danh sách trực tiếp từ mô hình xem là một ý tưởng hay, bởi vì nó sẽ yêu cầu mô hình xem có sự phụ thuộc kho lưu trữ" - Không nhất thiết. Mô hình Xem được điền trong bộ điều khiển (bao gồm danh sách các mục cần thiết cho SelectList), vì vậy không cần phụ thuộc kho lưu trữ trong chính Mô hình Xem. –

+0

Đó chính xác là quan điểm của tôi. Mã kho lưu trữ nên được gọi từ bộ điều khiển, không phải từ bên trong mã mô hình khung nhìn (hàm tạo hoặc một số phương thức khác). – Victor

2

Đó là khía cạnh dành riêng cho bản trình bày, vì vậy tôi thích làm điều đó trong Chế độ xem, sử dụng trình trợ giúp Html. Vì vậy, tôi vượt qua một bộ sưu tập để xem và sử dụng một phương pháp trợ giúp html để ánh xạ các mục để SelectListItems. Phương pháp có thể trông rất giống như thế này:

public static IList<SelectListItem> MapToSelectItems<T>(this IEnumerable<T> itemsToMap, Func<T, string> textProperty, Func<T, string> valueProperty, Predicate<T> isSelected) 
{ 
    var result = new List<SelectListItem>(); 

    foreach (var item in itemsToMap) 
    { 
     result.Add(new SelectListItem 
     { 
      Value = valueProperty(item), 
      Text = textProperty(item), 
      Selected = isSelected(item) 
     }); 
    } 
    return result; 
} 

Kính trọng.

+0

Bạn vẫn phải tạo một danh sách các mục trong ViewModel của bạn, vậy tại sao không chỉ làm cho nó trở thành một SelectList? –

+0

Bạn nói đúng, tôi đã nghĩ về mô hình cũng như một thực thể hoặc một bản dịch từ một thực thể (không phải là mô hình xem cụ thể hoặc ViewModel), dù sao, bạn có thể sử dụng phương pháp trên để thực hiện việc dịch. – uvita

+0

Tôi nghĩ rằng các mô hình xem cụ thể có thể sẽ hiển thị trực tiếp một SelectList, vì nó làm giảm số lượng mã bạn phải viết trong chế độ xem, ngay cả khi chỉ một chút. Nhưng trong một số trường hợp tôi vượt qua một đối tượng DTO hoặc kinh doanh để xem, và trong những trường hợp tôi sẽ gọi một helper như bạn hiển thị ở trên [tôi được gọi là .ToSelectList()] từ khung nhìn. Tôi nghĩ rằng cả hai phương pháp đều phù hợp trong các kịch bản khác nhau. –

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