MVC3 DropDownListFor - un semplice esempio?


112

Ho problemi con la DropDownListFormia app MVC3. Sono stato in grado di utilizzare StackOverflow per capire come farli apparire nella vista, ma ora non so come catturare i valori nelle sue proprietà corrispondenti sul modello di visualizzazione quando viene inviato. Affinché questo funzionasse, ho dovuto creare una classe interna che avesse un ID e una proprietà valore, quindi ho dovuto utilizzare un IEnumerable<Contrib>per soddisfare i DropDownListForrequisiti dei parametri. Ora, tuttavia, come dovrebbe MVC FW mappare il valore selezionato in questo menu a discesa nella proprietà stringa semplice sul mio modello di visualizzazione?

public class MyViewModelClass
{
    public class Contrib
    {
        public int ContribId { get; set; }
        public string Value { get; set; }
    }

    public IEnumerable<Contrib> ContribTypeOptions = 
        new List<Contrib>
        {
            new Contrib {ContribId = 0, Value = "Payroll Deduction"},
            new Contrib {ContribId = 1, Value = "Bill Me"}
        };

    [DisplayName("Contribution Type")]
    public string ContribType { get; set; }
}

Nella mia vista posiziono il menu a discesa sulla pagina in questo modo:

<div class="editor-label">
    @Html.LabelFor(m => m.ContribType)
</div>
<div class="editor-field">
    @Html.DropDownListFor(m => m.ContribTypeOptions.First().ContribId, 
             new SelectList(Model.ContribTypeOptions, "ContribId", "Value"))
</div>

Quando invio il modulo il ContribTypeè (ovviamente) nullo.

Qual è il modo corretto per farlo?

Risposte:


166

Dovresti fare così:

@Html.DropDownListFor(m => m.ContribType, 
                new SelectList(Model.ContribTypeOptions, 
                               "ContribId", "Value"))

Dove:

m => m.ContribType

è una proprietà in cui sarà il valore del risultato.


2
GRAZIE!!! Sergey, questo è esattamente quello che stavo cercando da molte ore.
Trey Carroll

Grazie :) per la tua risposta C'è un modo per mostrare "- Seleziona--" da qui. ?
kbvishnu

1
@VeeKeyBee, puoi aggiungere un nuovo elemento all'elenco contribTypeOptions, ad esempio new Contrib {ContribId = -1, Value = "Please Select"}e verrà mostrato nell'elenco a discesa. Di quanto si può verificare se ContribTypeè -1questo è un mezzo che l'utente non ha selezionato alcun valore
Sergey Gavruk

9
Puoi farlo:@Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value", Model.ContribTypeOptions.First().ContribId), "Select, please")
Sergey Gavruk

1
@SergeyGavruk. Questa risposta è stata usata come duplice su alcune domande recenti ma confonde alcuni utenti a causa dell'istruzione E l'ultimo parametro del costruttore dell'elenco di selezione è un valore selezionato - L'ultimo parametro viene ignorato dal metodo (che internamente costruisce il proprio SelectList) . È il valore della proprietà ( ContribType) che determina ciò che è selezionato (è così che funziona l'associazione del modello) e il codice dovrebbe essere @Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value")Puoi modificare la risposta per correggere.

7

Penso che questo aiuterà: In Controller ottieni gli elementi dell'elenco e il valore selezionato

public ActionResult Edit(int id)
{
    ItemsStore item = itemStoreRepository.FindById(id);
    ViewBag.CategoryId = new SelectList(categoryRepository.Query().Get(), 
                                        "Id", "Name",item.CategoryId);

    // ViewBag to pass values to View and SelectList
    //(get list of items,valuefield,textfield,selectedValue)

    return View(item);
}

e in visualizzazione

@Html.DropDownList("CategoryId",String.Empty)

5
Di solito non è un modello divino esporre il tuo repository alla vista in questo modo.
André Pena

6

Per associare dati dinamici in un DropDownList è possibile eseguire le seguenti operazioni:

Crea ViewBag nel controller come di seguito

ViewBag.ContribTypeOptions = yourFunctionValue();

ora usa questo valore in vista come di seguito:

@Html.DropDownListFor(m => m.ContribType, 
    new SelectList(@ViewBag.ContribTypeOptions, "ContribId", 
                   "Value", Model.ContribTypeOptions.First().ContribId), 
    "Select, please")

0
     @Html.DropDownListFor(m => m.SelectedValue,Your List,"ID","Values")

Qui il valore è quell'oggetto del modello in cui vuoi salvare il valore selezionato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.