2009-02-24 43 views
6

Tôi đang sử dụng ASP MVC RC1.Làm cách nào để đặt giá trị cho tùy chọn mặc định bằng Html.DropDownList

Biểu mẫu tôi đang sử dụng chứa danh sách thả xuống mà tôi đã đặt trong chế độ xem với mã này.

<%= Html.DropDownList("areaid", (SelectList)ViewData["AreaId"], "Select Area Id")%> 

Tuy nhiên, khi trả lại, đây là những gì tôi nhận được

<select id="areaid" name="areaid"> 
    <option value="">Select Area Id</option> 
    <option value="1">Home</option> 
    ... 
</select> 

Những gì tôi muốn là cho các tùy chọn Select Id Diện tích có giá trị 0 và đánh dấu nó như là lựa chọn mặc định để nó phù hợp với các giá trị khác và tôi có thể xác nhận một khu vực đã được chọn vì nó là một giá trị bắt buộc hay không. AreaId là một số nguyên vì vậy khi tôi hiện đang nhấp vào biểu mẫu mà không cần chạm vào danh sách thả xuống ở tất cả, MVC than phiền rằng "" không phải là một số nguyên và cho tôi một lỗi ràng buộc.

SO làm cách nào để đặt giá trị cho tùy chọn mặc định và sau đó chọn giá trị đó trên biểu mẫu?

Cảm ơn, Dan

Trả lời

21

Tôi nghĩ rằng bạn có ba bốn lựa chọn. Đầu tiên khi bạn đang xây dựng SelectList của bạn hoặc liệt kê SelectItemList, hãy thêm vào lựa chọn với nhãn tùy chọn của bạn và giá trị mặc định. Đặt nó ở trên cùng sẽ làm cho nó mặc định nếu một số giá trị khác chưa được chọn trong mô hình. Thứ hai, bạn có thể xây dựng các lựa chọn (và tùy chọn) "bằng tay" trong khung nhìn bằng cách sử dụng vòng lặp để tạo các tùy chọn. Một lần nữa, hãy thêm vào lựa chọn mặc định của bạn nếu một lựa chọn không được cung cấp trong mô hình. Thứ ba, sử dụng phần mở rộng DropDownList, nhưng sửa đổi giá trị của tùy chọn đầu tiên bằng cách sử dụng javascript sau khi trang được tải.

Dường như không thể sử dụng tiện ích mở rộng DropDownList để gán giá trị cho tùy chọnLabel vì nó được mã hóa cứng để sử dụng string.Empty. Dưới đây là đoạn mã có liên quan từ http://www.codeplex.com/aspnet.

// Make optionLabel the first item that gets rendered. 
    if (optionLabel != null) { 
     listItemBuilder.AppendLine(ListItemToOption(new SelectListItem() { Text = optionLabel, Value = String.Empty, Selected = false })); 
    } 

EDIT: Cuối cùng, cách tốt nhất là phải có mô hình của bạn lấy một giá trị Nullable và đánh dấu nó như yêu cầu sử dụng RequiredAttribute. Tôi khuyên bạn nên sử dụng mô hình xem cụ thể thay vì mô hình thực thể cho chế độ xem. Vì giá trị là Nullable, chuỗi rỗng sẽ hoạt động tốt nếu được đăng lại mà không chọn giá trị. Đặt giá trị này là giá trị bắt buộc sẽ khiến xác thực mô hình thất bại với thông báo thích hợp là giá trị được yêu cầu. Điều này sẽ cho phép bạn sử dụng trình trợ giúp DropdownList.

public AreaViewModel 
{ 
    [Required] 
    public int? AreaId { get; set; } 

    public IEnumerable<SelectListItem> Areas { get; set; } 
    ... 
} 

@Html.DropDownListFor(model => model.AreaId, Model.Areas, "Select Area Id") 
+1

Cảm ơn bạn. Bây giờ tôi tạo một đối tượng List , chèn một tùy chọn mặc định với giá trị 0 tại chỉ mục 0 và chuyển nó tới Html.DropDownList. Nó hoạt động một điều trị. – Hmobius

+0

Cảm ơn đã giúp tôi! Thật đáng buồn là ngay cả với MVC 3 cũng không thể thêm giá trị mặc định:/ – LanFeusT

+0

@LanFeusT - điều này đã được trả lời rất lâu trước MVC3. Tôi đã cập nhật nó cho một phương pháp tốt hơn để đối phó với nó từ một góc độ mô hình, đặc biệt. với MVC3. – tvanfosson

3

Đối với MVC3, SelectList có quá tải theo đó bạn có thể xác định giá trị đã chọn.

Function Create() As ViewResult 

     ViewBag.EmployeeId = New SelectList(db.Employees, "Id", "Name", 1) 

     Return View() 

    End Function 

Trong trường hợp này, tôi tình cờ biết rằng 1 là id của mục danh sách mặc định tôi muốn, nhưng có lẽ bạn có thể chọn mặc định thông qua truy vấn hay bất cứ những nổi thuyền của bạn

+0

Điều này làm việc tuyệt vời. Để trả lời câu hỏi của Dan, tôi tin rằng anh ấy muốn: –

0

Thay vì đi qua mục mặc định từ định nghĩa trong dạng xem, bạn có thể thêm dữ liệu "Chọn khu vực" tại chỉ mục thứ 0 của danh sách từ bộ điều khiển.

Bằng cách này, dữ liệu Chọn Diện tích có giá trị chỉ số 0.

0

Tôi muốn sử dụng SelectList tương tự cho nhiều thăng trầm thả và không muốn lặp lại trong các SelectList trong mô hình vì vậy tôi chỉ cần thêm một mới Phương thức mở rộng Html đã lấy giá trị và đặt mục đã chọn.

public static MvcHtmlString DropDownList(this HtmlHelper htmlHelper, string name, string value, IList<SelectListItem> selectList, object htmlAttributes) 
{ 
    IEnumerable<SelectListItem> items = selectList.Select(s => new SelectListItem {Text = s.Text, Value = s.Value, Selected = s.Value == value}); 
    return htmlHelper.DropDownList(name, items, null /* optionLabel */, htmlAttributes); 
} 
Các vấn đề liên quan