2013-02-07 28 views
6

Sto tentando di associare un menu a discesa in MVC3 in questo modo.L'elenco a discesa per Dizionario <stringa, stringa> non funziona con il valore selezionato

Modello

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

View

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

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

discesa non sta selezionando il valore selezionato, non so perché.

risposta

1

Model.sexpreference deve essere uno di questi valori: Etero ... questo funzionerà:

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

valori stanno arrivando in modo giusto . come S, G, BISEX ecc. –

+0

Non funziona, già controllato. –

14

Perché si sta configurando ViewBag.SexPreference quando si dispone di un modello? Dimentica questo ViewBag. Inoltre, dovresti avere 2 proprietà per creare un elenco a discesa: una proprietà di tipo scalare per contenere il valore selezionato e una proprietà di raccolta per contenere l'elenco dei valori selezionati. In questo momento sembra che tu stia usando solo uno e stai tentando di associare il DropDown a una proprietà della raccolta che ovviamente non ha alcun senso.

farlo nel modo giusto, utilizzando un modello di vista:

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

che si popolano nella vostra azione di controllo e passare alla vista:

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

e all'interno della vostra vista:

@model MyViewModel 

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

model.sexpreference è stringa non raccolta. Il problema –

+0

non associa il menu a discesa. il problema è nel valore selezionato. –

+1

Questo perché nel tuo ViewBag hai messo una collezione con lo stesso nome del valore di stringa nel tuo modello. Se si desidera andare contro le migliori pratiche e non utilizzare un modello di visualizzazione come suggerivo si potrebbe ancora farlo funzionare, ma è necessario rinominare il parametro ViewBag in modo che non sia in conflitto con il nome della stringa: 'ViewBag.AvailableSexPreferences = MemberHandler. SexPreference(); '. E poi all'interno della vista: '@ Html.DropDownListFor (m => m.sexpreference, nuova SelectList (ViewBag.AvailableSexPreferences," Value "," Key "))'. Ma ancora una volta questa non è una soluzione che consiglierei. –

0

L'ho fatto in modo diverso. È molto frustrante questa cosa.

Nel controllore fare qualcosa come:

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

E poi nel modello:

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

E poi finalmente nella vista:

<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

Troppo tardi per rispondere. :) Comunque grazie. –

Problemi correlati