2012-03-13 15 views
6

Tôi vẫn chưa chắc chắn cách tốt nhất để lưu trữ các tùy chọn danh sách lựa chọn cho hiển thị giao diện người dùng hoặc bộ nhớ db.Cách thực hành tốt nhất để xác định các tùy chọn chọn/thả xuống để tạo chế độ xem hoặc cửa hàng db

Tôi đã sử dụng Enums vào lúc này, và cũng có thể sử dụng trang trí Mô tả (How do you create a dropdownlist from an enum in ASP.NET MVC?)

Tôi bây giờ nghĩ rằng tôi cũng có thể chỉ cần tạo một lớp đầy đủ cho công cụ này, vì vậy tôi có thể lưu trữ sau thông tin đúng với toàn quyền kiểm soát:

  1. Item Name
  2. Mô tả đầy đủ
  3. int để lưu trữ trong db
  4. trật tự
  5. Bất kỳ phương thức nào để nhận thông tin từ danh sách.

Tôi có nên tự mình thực hiện tất cả điều này bằng tay không? Tôi muốn một cách thực sự vững chắc để làm điều này, và một enum không thực sự cảm thấy như nó sẽ cắt nó.

Trả lời

1

Bạn có thể sử dụng "mẫu kho lưu trữ" để truy cập dữ liệu và sử dụng chế độ xem giữa các bộ điều khiển và chế độ xem của bạn. Ví dụ:

//Model 
public class CustomerViewModel 
{ 
    public Customer customer { get;set; }   
    public IEnumerable<Village> Villages { get; set; } 
} 

//Controller 
public ActionResult Index() 
{ 
    var customerViewModel = new CustomerViewModel 
          { 
           Customer = new Customer(), 
           Villages = _villageService.GetAll() 
          }; 
    return View(customerViewModel); 
} 

//View 
@model ViewModel.RegisterViewModel 
@Html.DropDownListFor(q => q.Customer.VillageId, new SelectList(Model.Villages, "Id", "Title"), "Please Select") 

Tôi đã viết blog post về mẫu kho lưu trữ, bạn có thể xem.

+0

Xin chào, tôi không chắc chắn nếu bạn đã bỏ lỡ những gì tôi đang tìm kiếm? Đây là câu hỏi thêm về cách lưu trữ các tùy chọn cho một hộp thả xuống, không phải về cách sử dụng các kiểu xem và bộ điều khiển? Tôi ổn với những thứ đó? Làm thế nào để bạn lưu trữ các tùy chọn cho trình đơn thả xuống, nếu chúng không được định nghĩa trong db sẽ được mở rộng trong thời gian chạy? Ví dụ: sử dụng các mức vai trò tôi không muốn lưu trữ trong DB. –

+0

Trừ khi tôi đang xây dựng một ứng dụng cho phép vai trò tùy chỉnh của khóa học;) –

2

Bạn đang tìm kiếm giải pháp một kích thước phù hợp cho tất cả các tùy chọn danh sách lựa chọn của mình? Cá nhân tôi ủng hộ việc chọn tùy chọn phù hợp nhất với vấn đề cụ thể.

Trong một dự án gần đây, tôi đã được giới thiệu với kết hợp của một Smart Enum. Dưới đây là một ví dụ (Tôi xin lỗi vì lỗi đánh máy, tôi gõ lạnh này):

public class Priority 
{ 
    public enum Types 
    { 
     High, 
     Medium, 
     Low 
    } 

    public Types Type { get; private set; } 
    public string Name { get { return this.Type.ToString(); } } // ToString() with no arguments is not deprecated 
    public string Description { get; private set; } 

    public static High = new Priority{ Type = Types.High, Description = "..."}; 
    public static Medium = new Priority{ Type = Types.Medium, Description = "..."}; 
    public static Low = new Priority{ Type = Types.Low, Description = "..."}; 

    public static IEnumerable<Priority> All = new[]{High, Medium, Low}; 

    public static Priority For(Types priorityType) 
    { 
     return All.Single(x => x.Type == priorityType); 
    } 
} 

Vì vậy, trong việc thực hiện, bạn có thể lưu trữ các giá trị Enum, nhưng bạn sẽ tham khảo các đối tượng chính nó (Priority.For (thực thể. ưu tiên)) cho siêu dữ liệu bổ sung khi hiển thị chế độ xem của bạn.

Điều đó gần hơn với những gì bạn đang tìm kiếm? Tất nhiên, một trong những gotchas là nếu bạn cần phải viết một truy vấn đối với cơ sở dữ liệu dựa trên siêu dữ liệu trên tra cứu, giải pháp này sẽ tạo ra một vài giọt nước mắt trên đường đi.

3

Vị trí đầu tiên mà thông tin đó shoiuld là cơ sở dữ liệu ... hoặc bất kỳ "cửa hàng ảo" nào chẳng hạn như dịch vụ web cung cấp giao diện cho bạn db. Trong thực tế, nếu có các entiies db khác sử dụng các giá trị này thì PHẢI được thể hiện trong cơ sở dữ liệu, nếu không bạn sẽ gặp phải những rắc rối lớn. Trong thực tế, giả sử một trong các giá trị như vậy là một chuỗi .... nếu bạn không định nghĩa một bảng chứa tất cả các giá trị có thể có + một khóa và chỉ cần viết chuỗi như trong các bảng khác ... nó sẽ không thể cho bạn để thay đổi định dạng của chuỗi vì nó sẽ "lan truyền" trên db của bạn ... Ngược lại, nếu bạn chỉ sử dụng khóa ngoài để tham chiếu đến chuỗi đó ... bạn có thể dễ dàng thay đổi chúng vì chuỗi được lưu trữ chỉ trong ONE chỗ trong db của bạn. Ngoài ra giải pháp liệt kê cũng gặp phải vấn đề mà bạn không thể thêm hoặc xóa các giá trị ... vì vậy nếu các hoạt động như vậy "khái niệm" có thể có ý nghĩa bạn không thể sử dụng một điều tra. Bạn có thể sử dụng liệt kê khi tất cả các tùy chọn "khái niệm span" tất cả các khả năng, vì vậy bạn chắc chắn bạn sẽ không bao giờ thêm/xóa các tùy chọn khác, chẳng hạn như trong trường hợp liệt kê (có, không, không xác định).

Điều đó nói rằng, khi bạn có các tùy chọn trong db, phần còn lại rất dễ ... bạn sẽ có các thực thể DTO hoặc các thực thể nghiệp vụ đại diện cho chúng giống hệt cách bạn làm cho tất cả các thực thể DB khác.

Vì mục đích hiển thị, bạn có thể có phiên bản ViewModel của tùy chọn này có thể chứa khóa và mô tả và "Phương thức lưu trữ" mà trình điều khiển của bạn có thể gọi để có danh sách tất cả các tùy chọn.

Sau khi truy xuất các bộ điều khiển, hãy đặt chúng trong ViewViewModel trang tổng thể ... cùng với tất cả các thông tin khác sẽ được hiển thị trên trang. Từ ViewModel ... bạn có thể truy cập chúng để đặt chúng trong danh sách thả xuống.

Tổng hợp: 1) Bạn cần có đại diện DB tùy chọn 2) Sau đó, bạn sẽ có DTO, lớp nghiệp vụ và phiên bản Xem của thực thể này ... khi cần, chính xác như đối với tất cả các thực thể DB khác.

+0

OK, vì vậy tôi đoán solidairty của việc có các tùy chọn này trong db outweights tra cứu cần thiết để tìm ra những gì các tùy chọn được? Tôi chắc chắn không muốn vứt bỏ cơ sở dữ liệu của mình với vô số bảng gọn gàng, một bảng cho mỗi trình đơn thả xuống? Tôi có thể đặt tất cả các tùy chọn danh sách lựa chọn vào một bảng duy nhất và sử dụng id nhóm phụ để quản lý chúng như vậy không? Sau đó, tôi nhận được trở lại vào một vấn đề của các tùy chọn mình không được kiểm soát chặt chẽ và yêu cầu dữ liệu mặc định trong db từ một ngày?Điều này không bao giờ là một điều xấu (yêu cầu một số dữ liệu trong quá trình tạo sơ đồ bài đăng db của bạn) –

+0

nếu bạn có thể tạo một ví dụ về các tùy chọn của bạn, nó sẽ tuyệt vời .. Tôi không nói biến đổi từng danh sách của optiont thành một bảng, nhưng thông tin có thể được chứa trong cơ sở dữ liệu. Sau đó, bạn có thể truy xuất chúng với các truy vấn thích hợp. Đặt hoặc không một số tùy chọn trong cùng một bảng..depends ... nếu chúng đại diện cho cùng một "công cụ" được "lọc" theo những cách khác nhau trong lựa chọn khác nhau, bạn có thể làm điều đó ... nếu không thì không. Ví dụ, bạn có thể đặt danh sách của tất cả các thị trấn ở Mỹ trong cùng một bảng và sau đó trong một số lựa chọn bạn có thể sử dụng .. chỉ là những người của một tiểu bang. –

+0

Ở phía bên kia: nếu tùy chọn của bạn chỉ là một nhân viên Giao diện người dùng không có "ý nghĩa" trong miền doanh nghiệp, bạn có thể xem xét đặt chúng trong tệp cấu hình (hoặc liệt kê ... nếu chúng không thay đổi) .. nếu bạn có thể làm một vài ví dụ ... Tôi có thể trả lời như thế nào tôi sẽ dela với mỗi người trong số họ ... để làm rõ hơn những gì tôi đã nói. –

1

tôi lưu trữ tùy chọn của tôi trong Xem Models mình:

public class ViewModel { 

    [Required] 
    public int SelectListValue { get; set; } 

    public IDictionary<String,String> SelectListOptions { 
     get { 
      return new Dictionary<String, String>{ 
                { "0", Resources.Option1}, 
                { "1", Resources.Option2}, 
                { "2", Resources.Option3} 
               }; 
     } 
    } 

}

Sau đó, tôi chỉ có thể thả các dòng sau vào quan điểm của tôi để làm cho chọn danh sách:

<%= Html.DropDownListFor(m => m.SelectListValue, new SelectList(this.Model.SelectListOptions, "Key", "Value", "")) %> 
4

Tôi có nên suy nghĩ về việc tự mình thực hiện tất cả điều này bằng tay không?

Có. Enums thường là leaky and insufficient abstractions không phải lúc nào cũng phù hợp với mô hình miền phức tạp mà bạn thực sự là muốn đại diện.

Thay vì cuộn của riêng bạn, bạn có thể muốn xem xét lớp liệt kê của Headspring (qua github, nuget). Chúng tôi sử dụng nó tất cả thời gian thay vì enums bởi vì nó gần như là đơn giản và linh hoạt hơn nhiều.

Một ví dụ về một liệt kê "Nhà nước" và sử dụng nó như là một danh sách lựa chọn:

public class State : Enumeration<State> 
{ 
    public static State Alabama = new State(1, "AL", "Alabama"); 
    public static State Alaska = new State(2, "AK", "Alaska"); 
    // .. many more 
    public static State Wyoming = new State(3, "WY", "Wyoming"); 

    public State(int value, string displayName, string description) : base(value, displayName) 
    { 
     Description = description; 
    } 

    public string Description { get; private set; } 
} 

public IEnumerable<SelectListItem> Creating_a_select_list(State selected) 
{ 
    return State.GetAll().Select(
     x => new SelectListItem 
     { 
      Selected = x == selected, 
      Text = x.Description, 
      Value = x.Value.ToString() 
     }); 
} 

Tôi không cố gắng bán cho bạn về việc thực hiện đặc biệt này, bạn có thể chắc chắn tay mã của riêng bạn (các Enumeration lớp chỉ có khoảng 100 dòng mã). Nhưng tôi chắc chắn nghĩ rằng bạn sẽ được hưởng lợi từ việc vượt ra ngoài các enums cơ bản. Đó là cách tiếp cận đúng cho kịch bản bạn mô tả trong câu hỏi của bạn.

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