2012-03-01 28 views
10

Hiện tại tôi đang sử dụng điều khiển Html.EditorFor trong trang Xem 'Tạo' mặc định như thế này.Chuyển đổi HTML.EditorFor thành một trình đơn thả xuống (html.dropdownfor?)

<%: Html.EditorFor(model => model.IsActive) %> 

Tôi muốn chuyển đổi điều này thành danh sách thả xuống có giá trị và vẫn được liên kết với mô hình trong chế độ xem. Câu hỏi của tôi là hai lần.

  1. Nếu chỉ có 2/3 giá trị cần thiết trong trình đơn thả xuống .. Có cách nhanh chóng để điền rõ ràng 2 hoặc 3 giá trị không?

  2. Nếu danh sách lớn và cần đến từ truy vấn sql, cách thực hiện việc này?

Cảm ơn bạn đã trợ giúp.

Trả lời

30

Để tạo danh sách thả xuống, bạn cần 2 thuộc tính trên mô hình chế độ xem: thuộc tính vô hướng để ràng buộc giá trị đã chọn và thuộc tính bộ sưu tập sẽ chứa các mục để hiển thị trong trình đơn thả xuống.

Vì vậy, bạn có thể định nghĩa một mô hình điểm:

public class DropDownListViewModel 
{ 
    public string SelectedValue { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

và sau đó trên mô hình giao diện chính của bạn có một tài sản thuộc loại này:

public DropDownListViewModel Foo { get; set; } 

Bây giờ bạn có thể có một mẫu biên tập tùy chỉnh cho điều này loại (~/Views/Shared/EditorTemplates/DropDownListViewModel.ascx):

<%@ Control 
    Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DropDownListViewModel>" 
%> 
<%= Html.DropDownListFor(x => x.SelectedValue, Model.Items) %> 

và sau đó trong giao diện chính của bạn:

<%= Html.EditorFor(x => x.Foo) %> 

Bây giờ tất cả những gì còn lại là phải có hành động điều khiển của bạn render giao diện chính để lấp đầy Foo tài sản với giá trị tương ứng. Có thể được mã hóa cứng, đến từ một kho lưu trữ hoặc bất cứ thứ gì. Nó không thực sự quan trọng.

Mặt khác nếu bạn biết trước các giá trị bạn có thể hardcode họ trong các mẫu biên tập (~/Views/Shared/EditorTemplates/YesNoDropDown.ascx):

<%= Html.DropDownList(
    "", 
    new SelectList(
     new[] 
     { 
      new { Value = "true", Text = "Yes" }, 
      new { Value = "false", Text = "No" }, 
     }, 
     "Value", 
     "Text", 
     Model 
    ) 
) %> 

và sau đó:

<%= Html.EditorFor(x => x.IsActive, "YesNoDropDown") %> 

hoặc bằng cách trang trí tài sản IsActive trên kiểu xem của bạn:

[UIHint("YesNoDropDown")] 
public bool IsActive { get; set; } 

và sau đó:

<%= Html.EditorFor(x => x.IsActive) %> 
+0

Cảm ơn bạn đã giải pháp. Tôi đang nhận được một ngoại lệ định danh được mong đợi trong trang trình soạn thảo .ascx trang ... gần mới [] – ZVenue

+0

@ZVenue, vẫn còn vấn đề với điều này? –

+0

Không còn vấn đề gì nữa .. cảm ơn sự giúp đỡ của bạn .. Giải pháp đã sửa đổi của bạn ở đây .. http://stackoverflow.com/questions/9568111/problems-converting-editorfor-to-dropdownlist – ZVenue

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