2011-08-29 44 views

Trả lời

74

Vì vậy, tôi đã làm một cái gì đó như thế này:

@Html.DropDownListFor(model => model.Dessert, 
         new SelectList(Model.AvailableDesserts, "DessertID", "DessertName"), 
         "---Select A Dessert ---") 

vẻ làm việc khá tốt. Dessert trong chế độ xem của tôi là chế độ xem được người dùng chọn. AvailableDesserts là một bộ sưu tập của những người để lựa chọn. Hy vọng rằng sẽ giúp.

+2

Điều này thêm "--Xin vui lòng chọn--" ở đầu trình đơn thả xuống, nhưng mặc định là mục tiếp theo trong trình đơn thả xuống, ít nhất trong ví dụ của tôi: @ Html.DropDownListFor ( x => x.SelectedTeamID, SelectList mới (Model.Teams, "TeamID", "TeamName"), "--Xin vui lòng chọn--") – user517406

+4

Giá trị mặc định của SelectedTeamID bạn đang gửi đến Chế độ xem là gì? Trong 'Create.cshtml' của tôi, nó sẽ mặc định là tùy chọn" --- Select A Dessert --- "(ID là một số nguyên và mặc định là 0) trong' Edit.cshtml' của nó, nó sẽ mặc định giá trị hiện tại là cho 'model.Dessert' trong viewmodel của tôi. Điều này có thể là kết quả của DessertIds của tôi bắt đầu từ 1 (khóa chính trong bảng Món tráng miệng của tôi bắt đầu từ 1). Chỉ là một đoán, thực sự. Tôi nghĩ đó là lý do tại sao điều đó xảy ra. – itsmatt

+0

Tôi tin rằng những gì nó làm là nhìn vào giá trị hiện tại của trường mô hình và sau đó thử chọn theo mặc định. Ví dụ, nếu khi bạn xây dựng viewmodel của bạn (nói, cho một cuộc gọi Create) và thiết lập rõ ràng SelectedTeamID thành 6 và chuyển nó vào View, nó sẽ hiển thị TeamName được liên kết với TeamID 6, giả sử một tồn tại. – itsmatt

14

Tôi có một phương pháp vài phần mở rộng trên SelectList

public static SelectList PreAppend(this SelectList list, string dataTextField, string selectedValue, bool selected=false) 
    { 
     var items = new List<SelectListItem>(); 
     items.Add(new SelectListItem() { Selected = selected, Text = dataTextField, Value = selectedValue }); 
     items.AddRange(list.Items.Cast<SelectListItem>().ToList()); 
     return new SelectList(items, "Value", "Text"); 
    } 
    public static SelectList Append(this SelectList list, string dataTextField, string selectedValue, bool selected=false) 
    { 
     var items = list.Items.Cast<SelectListItem>().ToList(); 
     items.Add(new SelectListItem() { Selected = selected, Text = dataTextField, Value = selectedValue }); 
     return new SelectList(items, "Value", "Text"); 
    } 
    public static SelectList Default(this SelectList list,string DataTextField,string SelectedValue) 
    { 
     return list.PreAppend(DataTextField, SelectedValue, true); 
    } 

Sau đó dao cạo của tôi trông giống như:

@Html.DropDownListFor(m=>m.SelectedState, 
    Model.StateList().Default("Select One","")) 
+0

Tôi mới tham gia MVC, bạn có thể vui lòng không cho tôi biết làm thế nào tôi sẽ thêm các phương pháp mở rộng vào SelectList của tôi? – user517406

+3

Thêm lớp tĩnh vào dự án của bạn và thêm các phương thức này vào dự án. Đảm bảo rằng trang của bạn đang cố gắng gọi cho chúng từ nhập khẩu không gian tên nếu không phải là không gian tên dự án toàn cầu. Cú pháp trong dao cạo là '@using Myproject.Extensions' hoặc bất kỳ tên nào bạn đặt tên cho lớp của bạn. Để tham khảo thêm, vui lòng đọc: http://msdn.microsoft.com/en-us/library/bb383977.aspx – asawyer

+0

Tôi thích tuyến đường Helper/Extension hơn khi bạn đề xuất nhưng đang gặp phải sự cố khi triển khai. Tôi nhận được lỗi sau: 'Không thể bỏ đối tượng kiểu 'MyApp.UI.Models.Address' để nhập 'System.Web.Mvc.SelectListItem'.' Mã tôi sử dụng là:' @ Html.DropDownListFor (m => m.EmailAddressID, SelectList mới (Model.Addresses, "AddressID", "EmailAddress"). PreAppend ("--- Chọn một địa chỉ ---", "")) 'Nó biên dịch tốt và được nhận ra trong khung nhìn, nhưng trình bày lỗi ở trên khi chạy. Phương thức hardcoded được trình bày bởi @itsmatt không hoạt động. Bất kỳ ý tưởng về sửa đổi tôi có thể cần đến các phương pháp mở rộng? – atconway

3

Hi gì về việc cố gắng này (trong trường hợp bạn sử dụng phương pháp DisplayFor)

private IEnumerable<SelectListItem> AddDefaultOption(IEnumerable<SelectListItem> list, string dataTextField, string selectedValue) 
    { 
     var items = new List<SelectListItem>(); 
     items.Add(new SelectListItem() { Text = dataTextField, Value = selectedValue}); 
     items.AddRange(list); 
     return items; 
    } 

Sau đó, chỉ cần thêm mã này vào Bộ điều khiển

của bạn
//lambda expression binding 
ViewBag.YourList = db.YourTable.Select(x => x).ToList().Select(x => new SelectListItem 
     { 
      Value = x.Id.ToString(), 
      Text = x.DisplayName.ToString() 
     }); 

     ViewBag.YourList = AddDefaultOption(ViewBag.YourList, "Select One...", "null", true); 

Và cuối cùng tại Xem bạn có thể hiển thị một danh sách thả xuống, combobox chỉ như thế này

<div class="editor-label"> 
     Your Label 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.ForeignKey, (IEnumerable<SelectListItem>)ViewBag.YourList) 
    </div> 
+0

Đó là lạ mà bạn đang làm '.Select (x => x). ToList()' trước khi ' .Select (x => new SelectListItem' Điều đó là không cần thiết. –

0

tôi muốn thiết lập giá trị mặc định cho bất cứ điều gì đã được thông qua như một Url Parameter gọi SiteType:

<div class="form-group"> 
     @Html.LabelFor(model => model.Type, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownListFor(model => model.Type, ChangeOrderSite.SiteTypeNames.Select(s => new SelectListItem { Text = s.Value, Value = s.Key.ToString(), Selected = s.Key.ToString() == Request["SiteType"] }), new { @class = "control-label col-md-2" }) 
      @Html.ValidationMessageFor(model => model.Type) 
     </div> 
    </div> 

Trình đơn thả xuống của tôi là danh sách các loại trang web.

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