2011-10-04 18 views
6

Tôi đang tạo và điền một từ điển và muốn liên kết nó với danh sách thả xuống bằng cách sử dụng phương pháp trợ giúp DropDownListFor.Binding DropDownListFor trợ giúp vào một từ điển

Làm cách nào để ánh xạ từ điển keyvalue để thả xuống của từ điển đó?

Dường như tôi sẽ có thể làm điều gì đó như:

@Html.DropDownListFor(o => o.key, o => o.value, MyDictionary); 

Nó có vẻ như các tham số đầu tiên phải là một tuyên bố LINQ mà các bản đồ cặp khóa/giá trị và tham số thứ hai là từ điển riêng của mình.

Trả lời

10

Bạn không thể ràng buộc danh sách thả xuống từ điển. Nó không có ý nghĩa. Để tạo ra một danh sách thả xuống, bạn cần 2 thứ: một thuộc tính vô hướng để ràng buộc giá trị đã chọn và một bộ sưu tập để ràng buộc các tùy chọn của danh sách thả xuống. Bạn chỉ có thứ hai trong hai thứ đó là từ điển. Vì vậy, bạn không thể sử dụng một helper mạnh mẽ đánh máy.

Bạn có thể làm việc xấu xa như sau:

@Html.DropDownList("SelectedValue", new SelectList(MyDictionary, "Key", "Value")) 

nhưng tất nhiên một cách tiếp cận tốt hơn sẽ được sử dụng một mô hình điểm:

public class MyViewModel 
{ 
    public string SelectedValue { get; set; } 
    public SelectList Values { get; set; } 
} 

mà bạn sẽ cư trong hành động điều khiển của bạn:

public ActionResult Foo() 
{ 
    Dictionary<string, string> dic = ... 
    var model = new MyViewModel 
    { 
     Values = new SelectList(dic, "Key", "Value") 
    }; 
    return View(model); 
} 

và cuối cùng là chế độ xem được nhập mạnh mẽ:

@model MyViewModel 
@Html.DropDownListFor(x => x.SelectedValue, Model.Values) 
+1

"Bạn có thể không ràng buộc danh sách thả xuống từ điển. Nó không có ý nghĩa "Bạn có thể giải thích tại sao? Bởi vì chúng ta có thể dễ dàng làm điều đó trong ASP.NET Web Forms. –

0

Tôi thích câu trả lời của bạn Darin. Cảm ơn, nó đã giúp tôi đưa ra giải pháp này. Cho đến nay tôi chỉ thử nó bằng dây, nhưng nó hoạt động tốt. Dưới đây chỉ là một ví dụ đơn giản. Tôi cũng có các phương thức mở rộng (không hiển thị ở đây) để xây dựng các đối tượng View Model từ các đối tượng Model Schema (cho HttpGets) và để xây dựng các đối tượng mô hình lược đồ từ các đối tượng View Model (cho HttpPosts).

Xem mẫu Phương pháp

public class Step4ViewModel 
{ 
    public SelectList HowToBeContactedOptions { get; set; } 

    public string HowToBeContacted { get; set; } 
} 

mở rộng để làm cho mọi việc dễ dàng hơn và sạch hơn

public static class EntityExtensionMethods 
{ 
    public static Step4ViewModel PopulateDropDowns(this Step4ViewModel vm) 
    { 
     var howToBeContactedOptions = new Dictionary<string, string> 
     { 
      {"Email", "Email"}, 
      {"US Mail", "US Mail"} 
     }; 

     vm.HowToBeContactedOptions = new SelectList(howToBeContactedOptions, "Key", "Value", vm.HowToBeContacted); 
} 

khiển

[HttpPost] 
public ActionResult Step4(Step4ViewModel vm) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(vm.PopulateDropDowns()); 
    } 
} 

Xem

@Html.ValidationSummary() 
<table class="table table-bordered table-striped"> 
    <tr> 
     <td> 
      @Html.LabelFor(x => x.HowToBeContacted) 
     </td> 
     <td> 
      @Html.DropDownListFor(x => x.HowToBeContacted, Model.HowToBeContactedOptions) 
      @Html.ValidationMessageFor(x => x.HowToBeContacted) 
     </td> 
    </tr> 
</table> 
1

Bạn nên cố gắng như thế này:

Trong điều khiển

ViewBag.hour = new SelectList(Hours.Values); 

void AddHours() 
{ 
    Hours = new Dictionary<int, string>(); 
    Hours.Add(00, "00"); 
    Hours.Add(01, "01"); 
    Hours.Add(02, "02"); 
} 

Trong lần xem

<div class="col-md-2"> 
    @Html.DropDownList("Hours", new SelectList(ViewBag.hour.Items), "Hours", htmlAttributes: new { @class = "form-control", placeholder = "Hours" }) 
</div> 
Các vấn đề liên quan