2013-03-04 40 views
9

Tôi có một Mô hình bao gồm thông tin Nhân viên. Trong mô hình của tôi có một tài sản được gọi là Thành phố xác định thành phố của Nhân viên mà anh ta đang sống. Mức độ phù hợp được hiển thị bên dướiMVC DropDownListfor() Khái niệm cơ bản

public string City{get;set;} 

Bây giờ tôi có chế độ xem chứa biểu mẫu sẽ được nhân viên đăng ký. Tôi muốn sử dụng danh sách thả xuống để chọn thành phố. Tôi nghĩ rằng các mã dưới đây sẽ được sử dụng cho thả xuống như tôi phát hiện ra. Tên mẫu của tôi là Employee.

@Html.DropDownListFor(m=>m.City,new SelectList()) 

Xin vui lòng cho tôi biết "có cách nào để xác định các tùy chọn cho danh sách thả xuống trong phương thức SelectList() trực tiếp như ... trong html?"

Nếu không, tôi nên xác định lớp cho trình đơn thả xuống này ở đâu, nơi cần gọi và nơi hiển thị. Tôi không biết xác định giá trị ở đâu? Tôi rất bối rối vì đây là mvc và chúng tôi phải lo lắng riêng và tôi nghĩ rằng chúng tôi không thể xác định bất cứ điều gì ở bất cứ đâu?

Thanks in advance ..

+0

Giá trị sẽ đến từ đâu? Nó có phải là chìa khóa nước ngoài vào một bảng cơ sở dữ liệu, các giá trị hardcoded, cái gì khác? –

+0

http://stackoverflow.com/questions/10484774/dropdown-in-mvc –

Trả lời

10

Bạn có ít nhất hai lựa chọn:

1.) Thêm một danh sách, mảng, hay bất kỳ loại bộ sưu tập khác của thành phố để mô hình của bạn

2.) Thêm thuộc tính SelectList vào mô hình của bạn

Tùy chọn 1 có thể đơn giản như một chuỗi các chuỗi hoặc có thể là đối tượng IEnumerable của City. Sau đó, bạn sẽ cần biến đổi thuộc tính này thành một tập hợp các đối tượng SelectListItem trong dạng xem như một phần của ràng buộc DropDownList.

Tùy chọn 2 có lợi thế là có khả năng liên kết trực tiếp với DropDownList, nhưng yêu cầu bạn xây dựng danh sách trong phương thức hành động.

Sau đó kết quả cuối cùng là như nhau, đó chỉ là vấn đề về cách bạn muốn trở thành người khổng lồ về SoC.

Ví dụ (giả sử bạn thêm một tính chất gọi Cities):

@Html.DropDownListFor(m=>m.City, Model.Cities.Select(city => new SelectListItem() 
{ 
    Text = city, 
    Value = city, 
    Selected = city == Model.City 
}) 

EDIT:

Để trả lời bình luận của bạn, tôi phải thực hiện một số giả định. Tôi sẽ giả sử bạn có một mô hình được gọi là EmployeeModel. Mô hình này có thuộc tính, City, là một chuỗi đơn giản. Vì vậy, đây là một phần của mô hình của bạn, như tôi giả định nó là:

public class EmployeeModel 
{ 
    public string City { get; set; } 

    // ... other properties ... 
} 

Vì vậy, nếu bạn cần phải thêm một tài sản để ràng buộc để thả xuống, bạn sẽ làm một trong các cách sau:

public class EmployeeModel 
{ 
    public string City { get; set; } 

    public IEnumerable<string> Cities { get; set; } 

    // ... other properties ... 
} 

hoặc

public class EmployeeModel 
{ 
    public string City { get; set; } 

    public SelectList Cities { get; set; } 

    // ... other properties ... 
} 

tài sản mới này sẽ chứa danh sách các thành phố mà bạn cho phép người dùng của bạn (s) để chọn từ.

Nếu bạn chọn tùy chọn đầu tiên, bạn tải IEnumerable từ kho dữ liệu của bạn, và sau đó sử dụng ví dụ đầu tiên ở trên trong dạng xem của bạn, sử dụng LINQ để chiếu từng chuỗi trong thuộc tính Cities vào đối tượng SelectListItem mới.

Nếu bạn chọn tùy chọn thứ hai, bạn tạo một SelectList trong hành động trước khi chuyển mô hình đến chế độ xem. Đây không phải là khó khăn khủng khiếp, vì lớp này cung cấp một hàm tạo có một số IEnumerable (danh sách các thành phố của bạn) và "giá trị đã chọn", sẽ là thuộc tính City (xem http://msdn.microsoft.com/en-us/library/dd460123%28v=vs.108%29.aspx). Mã của bạn sẽ giống như thế:

model.Cities = new SelectList(GetCities(), model.City); 

này, tất nhiên, giả sử bạn có một phương pháp helper (GetCities()) để tải các thành phố của bạn từ bất cứ nơi nào chúng được lưu trữ. tầm nhìn của bạn sau đó sẽ có một cái gì đó như thế này:

@Html.DropDownListFor(m=>m.City, model.Cities) 

Các công cụ xem sau đó sử dụng những SelectListItem s để xây dựng các yếu tố <select> và nó <option> yếu tố.

+0

bạn có thể xây dựng 1 và 2 tùy chọn thêm để tôi có thể hiểu dễ dàng không. Tôi vẫn đang gặp vấn đề. –

2

Bạn có thể có điều này trong mô hình của bạn, nó nhanh chóng đạt được, mặc dù tôi không muốn giới thiệu nó:

public class Place 
{ 
    public string City{get;set;} 
    public SelectListItem[] Cities() 
    { 
     return new SelectListItem[2] { new SelectListItem() { Text = "London" }, new SelectListItem() { Text = "New York" } }; 
    } 
} 

... và xem bạn

@Html.DropDownListFor(m => m.City, Model.Cities()) 

Tôi nghĩ rằng nơi tốt nhất cho một cái gì đó như thế này (nhưng phức tạp hơn một chút) là của riêng sử dụng htmlhelper và bạn có thể trông giống như:

@html.CityDropDownFor(m => m.City) 

Bạn có thể lưu trữ thành phố một cách độc đáo và giữ dữ liệu và giao diện người dùng làm việc ra khỏi các mô hình của bạn.

Nếu bạn muốn tìm hiểu thêm về cách tạo người trợ giúp của riêng mình, tôi đề xuất một chút [đọc]. 1

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