2013-02-07 30 views
6

Tôi đang cố gắng liên kết một menu thả xuống trong MVC3 theo cách này.Danh sách thả xuống với từ điển <string, string> không hoạt động với giá trị được chọn

Mẫu

public static Dictionary<string, string> SexPreference() 
{ 
     var dict = new Dictionary<string, string>(); 
     dict.Add("Straight", "S"); 
     dict.Add("Gay", "G"); 
     dict.Add("Bisexual", "BISEX"); 
     dict.Add("Bicurious", "BICUR"); 
     return dict; 
} 

khiển

ViewBag.SexPreference = MemberHandler.SexPreference(); 

Xem

@{ 
var itemsSexPreference = new SelectList(ViewBag.SexPreference, "Value", "Key", Model.sexpreference); 
} 

@Html.DropDownListFor(m => m.sexpreference, @itemsSexPreference) 

Dropdown không chọn giá trị được lựa chọn, không biết tại sao.

Trả lời

1

Model.sexpreference phải là một trong các giá trị: Straight ... này sẽ làm việc:

public static Dictionary<string, string> SexPreference() 
{ 
    var dict = new Dictionary<string, string>(); 
    dict.Add("S", "Straight"); 
    dict.Add("G", "Gay"); 
    dict.Add("BISEX", "Bisexual"); 
    dict.Add("BICUR", "Bicurious"); 
    return dict; 
} 

@{ 
    var itemsSexPreference = new SelectList(ViewBag.SexPreference, "Key", "Value", "S"); 
} 
+0

giá trị đang đến trong đúng cách . như S, G, BISEX vv –

+0

Không hoạt động, đã được kiểm tra. –

14

Tại sao các bạn cách thiết lập ViewBag.SexPreference khi bạn có một mô hình? Quên về ViewBag này. Ngoài ra, bạn nên có 2 thuộc tính để tạo danh sách thả xuống: thuộc tính loại vô hướng để giữ giá trị được chọn và thuộc tính bộ sưu tập để giữ danh sách các giá trị đã chọn. Ngay bây giờ bạn dường như chỉ sử dụng một và cố gắng liên kết DropDown với một thuộc tính sưu tập mà rõ ràng là không có ý nghĩa gì cả.

Làm điều đó một cách đúng đắn, bằng cách sử dụng một mô hình điểm:

public class MyViewModel 
{ 
    public string SelectedSexPreference { get; set; } 
    public Dictionary<string, string> SexPreferences { get; set; } 
} 

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

public ActionResult SomeAction() 
{ 
    var model = new MyViewModel(); 

    // Set the value that you want to be preselected 
    model.SelectedSexPreference = "S"; 

    // bind the available values 
    model.SexPreferences = MemberHandler.SexPreference(); 

    return View(model); 
} 

và bên trong xem của bạn:

@model MyViewModel 

@Html.DropDownListFor(
    m => m.SelectedSexPreference, 
    new SelectList(Model.SexPreferences, "Value", "Key") 
) 
+1

model.sexpreference là chuỗi không thu thập. –

+0

vấn đề không có trong ràng buộc thả xuống. vấn đề nằm trong giá trị đã chọn. –

+1

Đó là vì trong ViewBag của bạn, bạn đã đặt một bộ sưu tập có cùng tên với giá trị chuỗi trong mô hình của bạn. Nếu bạn muốn chống lại các thực hành tốt nhất và không sử dụng mô hình xem như tôi đề xuất bạn vẫn có thể làm cho nó hoạt động nhưng bạn cần đổi tên tham số ViewBag của mình để nó không xung đột với tên thuộc tính chuỗi của bạn: 'ViewBag.AvailableSexPreferences = MemberHandler. SexPreference(); '. Và sau đó bên trong khung nhìn: '@ Html.DropDownListFor (m => m.sexpreference, SelectList mới (ViewBag.AvailableSexPreferences," Value "," Key "))'. Nhưng một lần nữa đây không phải là một giải pháp tôi muốn giới thiệu. –

0

Tôi đã làm điều đó khác đi. Nó rất bực bội toàn bộ điều này.

Trong bộ điều khiển làm một cái gì đó như:

var percentagesFromDb = _service1.GetPercentagesFromDb(parameters); 
var percentages = percentagesFromDb.ToDictionary(percentage => percentage.someKey, 
               percentage => percentage.someValue); 
ViewData["selectedPercentages"] = percentages; 

Và sau đó trong mô hình:

[Display(Name = "%")] 
public string Percentage { get; set; } 

private static Dictionary<string, string> GetPercentageList() 
{ 
    return new Dictionary<string, string> 
    { 
     {"100", "100%"}, 
     {"90", "90%"}, 
     {"80", "80%"}, 
     {"70", "70%"}, 
     {"60", "60%"}, 
     {"50", "50%"}, 
     {"40", "40%"}, 
     {"30", "30%"}, 
     {"20", "20%"}, 
     {"10", "10%"} 
    }; 
} 

public SelectList GetSelectList(string selected, object selectedPercentages) 
{ 
    var selectedDict = new Dictionary<string, string>(); 
    if (selectedPercentages != null) 
     selectedDict = (Dictionary < string, string>) selectedPercentages; 
    var selectedvalue = selectedDict.ContainsKey(selected) ? selectedDict[selected] : "100"; 
    Percentage = selectedvalue; 
    return new SelectList(GetPercentageList(), "Key", "Value"); 
} 

Và cuối cùng trong giao diện:

<table class="table table-bordered table-striped"> 
    <thead> 
    <tr> 
     <th>@Html.LabelFor(m => m.Items, new {@class = "control-label"})</th> 
     <th>@Html.LabelFor(m => m.Percentage, new {@class = "control-label"})</th> 
    </tr> 
    </thead> 
    <tbody> 
    @foreach (var item in Model.Items) 
    { 
     <tr> 
      <td> 
       @item.Value 
      </td> 

      <td> 
       @Html.DropDownListFor(m => m.Percentage, 
       Model.GetSelectList(item.Key, ViewData["selectedPercentages"]), 
       new {@class = "form-control", id = item.Key}) 
      </td> 
     </tr> 
    } 
    </tbody> 
</table> 
+0

Quá muộn để trả lời. :) Anyways cảm ơn. –

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