2013-02-07 8 views
6

Próbuję powiązać rozwijanie w MVC3 w ten sposób.Lista rozwijana dla z Słownikiem <ciąg, ciąg> nie działa z wybraną wartością

model

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; 
} 

Controller

ViewBag.SexPreference = MemberHandler.SexPreference(); 

Zobacz

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

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

rozwijane nie wybierając wybraną wartość, nie wiem dlaczego.

Odpowiedz

1

Model.sexpreference musi być jedną z tych wartości: Prosto ... będzie działać:

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

wartości są nadchodzący w odpowiedni sposób . jak S, G, BISEX itp. –

+0

Nie działa, już sprawdzone. –

14

Czemu ustawienie ViewBag.SexPreference gdy masz model? Zapomnij o tym pakiecie ViewBag. Powinieneś również mieć dwie właściwości, aby utworzyć listę rozwijaną: właściwość typu skalarnego do przechowywania wybranej wartości i właściwość kolekcji do przechowywania listy wybranych wartości. W tej chwili wydaje się, że używasz tylko jednego i próbujesz powiązać DropDown z właściwością kolekcji, która oczywiście nie ma żadnego sensu.

Czy to we właściwy sposób, przy użyciu widoku modelu:

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

, które można wypełnić w swoim działaniu sterownika i przejść do widoku:

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); 
} 

i wewnątrz widzenia:

@model MyViewModel 

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

model.sexpreference to ciąg nie jest kolekcją. –

+0

problem nie jest związany lista rozwijana. problem ma wybraną wartość. –

+1

To dlatego, że w swojej aplikacji ViewBag umieściliśmy kolekcję o tej samej nazwie co wartość ciągu w modelu. Jeśli chcesz postępować zgodnie ze sprawdzonymi metodami i nie używać modelu widoku, co sugerowałem, możesz nadal działać, ale musisz zmienić nazwę parametru ViewBag, aby nie kolidował on z nazwą właściwości ciągu znaków: 'ViewBag.AvailableSexPreferences = MemberHandler. SexPreference(); '. A następnie wewnątrz widoku: '@ Html.DropDownListFor (m => m.sexpreference, nowa SelectList (ViewBag.AvailableSexPreferences," Value "," Key "))'. Ale po raz kolejny nie jest to rozwiązanie, które polecam. –

0

Zrobiłem to inaczej. To bardzo frustrujące w tej całej sprawie.

W regulatorze zrobić coś takiego:

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

a następnie w modelu

[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"); 
} 

i wreszcie w widoku:

<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

Za późno, aby odpowiedzieć. :) W każdym razie dzięki. –

Powiązane problemy