2010-08-15 37 views

Trả lời

102

Bạn có thể sử dụng LINQ:

Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(v => new SelectListItem { 
    Text = v.ToString(), 
    Value = ((int)v).ToString() 
}).ToList(); 
+0

Mặc dù * LINQ * đã trở thành tên không chính thức của Tiện ích mở rộng có thể đếm được nhưng tôi không thể không tự hỏi liệu có điều gì phù hợp hơn không. – ChaosPandion

+1

Đó là một phần của không gian tên và dự án LINQ và IMO là tên chính xác. Linq cũng là tên của phần mở rộng ngôn ngữ. – Dykam

+0

mã này ở trên không được biên dịch. Tôi đang cố gắng thực hiện điều này: Liệt kê dropdown = Enum.GetValues ​​(typeof (EventType)). Chọn (v => new SelectListItem { Selected = (int) v == id, Text = v.ToString (), Giá trị = ((int) v) .ToString() }). ToList(); menu thả xuống trả về; nhưng gặp lỗi: "Không thể truyền biểu thức từ TSource đến int" trong các dòng đang thực hiện (int) v) – leora

2

Bây giờ tôi sử dụng Tuple<string, string> nhưng bạn có thể chuyển đổi này để sử dụng bất cứ điều gì:

var values = Enum.GetValues(typeof(DayOfWeek)) 
    .Cast<DayOfWeek>() 
    .Select(d => Tuple.Create(((int)d).ToString(), d.ToString())) 
    .ToList() 
4

Bạn có thể sử dụng Enum.GetNames() để có được một mảng chuỗi chứa tên của các mục enum. Nếu tên mục của bạn thân thiện với người dùng, thì điều này có thể đủ tốt. Nếu không, bạn có thể tạo phương thức GetName() của riêng mình để trả về tên đẹp cho mỗi mục.

HOẶC - nếu enum sẽ không bao giờ (hoặc hiếm khi) thay đổi, bạn chỉ có thể tạo phương thức trực tiếp thêm các mục được mã hóa cứng vào danh sách thả xuống của mình. Điều này có lẽ hiệu quả hơn (nếu điều đó quan trọng đối với bạn).

17

Kể từ khi MVC 5.1, cách thanh lịch nhất sẽ được sử dụng EnumDropDownListFor phương pháp Html helper nếu bạn cần để cư select tùy chọn theo quan điểm của bạn:

@Html.EnumDropDownListFor(m => m.MyEnumProperty,new { @class="form-control"}) 

hoặc GetSelectList phương pháp của EnumHelper trong bộ điều khiển của bạn:

var enumList = EnumHelper.GetSelectList(typeof (MyEnum)); 
+0

đẹp nhất, cảm ơn! –

+0

Rất trơn! Không biết về điều này ... nên là câu trả lời đúng. –

+0

wow, tôi không biết. rất nhiều dòng mã được lưu ngay bây giờ! Cảm ơn bạn! –

4

Tôi đã làm điều này bằng cách sử dụng một phương pháp tĩnh mà tôi có thể tái sử dụng.

public static IEnumerable<SelectListItem> EnumToSelectList<T>() 
{ 
    return (Enum.GetValues(typeof(T)).Cast<T>().Select(
     e => new SelectListItem() { Text = e.ToString(), Value = e.ToString() })).ToList(); 
} 
0

tôi đã sử dụng GetEnumSelectList từ lớp Helper Html

<select asp-for="MyProperty" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()" ></select> 
Các vấn đề liên quan