Come scrivere un semplice Html.DropDownListFor ()?


133

In ASP.NET MVC 2, vorrei scrivere un elenco a discesa molto semplice che fornisca opzioni statiche. Ad esempio, vorrei fornire una scelta tra "Rosso", "Blu" e "Verde".

Risposte:


188

Vedi questo articolo MSDN e un esempio di utilizzo qui su StackTranslate.it .

Supponiamo che tu abbia la seguente classe Linq / POCO:

public class Color
{
    public int ColorId { get; set; }
    public string Name { get; set; }
}

E diciamo che hai il seguente modello:

public class PageModel 
{
   public int MyColorId { get; set; }
}

E, infine, diciamo che hai il seguente elenco di colori. Potrebbero provenire da una query Linq, da un elenco statico, ecc .:

public static IEnumerable<Color> Colors = new List<Color> { 
    new Color {
        ColorId = 1,
        Name = "Red"
    },
    new Color {
        ColorId = 2,
        Name = "Blue"
    }
};

A tuo avviso, puoi creare un elenco a discesa in questo modo:

<%= Html.DropDownListFor(n => n.MyColorId, 
                         new SelectList(Colors, "ColorId", "Name")) %>

1
davvero chiaro. Vorrei sapere dove devo inserire IEnumerable <Colore> nel mio codice? So che sembra stupido come una domanda, ma sono molto perso e nuovo in esso: s
Rinesse

7
Nessun problema, amico. So come si sente. :) Come hai suggerito nella tua domanda iniziale, si tratta di un elenco statico che creerai nel codice o stai per estrarre questo elenco da un database?
Evan Nagle,

un elenco statico che contiene 4 opzioni non sfogliare una base di dati
Rinesse,

6
Crea una classe statica chiamata "HtmlLists" o qualcosa del genere. Inserire la classe statica nello spazio dei nomi System.Web.Mvc. Nella tua classe statica, aggiungi il tuo elenco statico di colori IEnumerable <Colore>. Quindi, a tuo avviso, puoi fare riferimento a esso chiamando HtmlLists.Colors. Spero che abbia un senso. Fammi sapere. :)
Evan Nagle,

2
Non sapevo come farlo: '(... non so dove mettere la classe Color e le HtmlLists (nella cartella dei modelli potrebbe essere?) E come fare riferimento nella vista. Aloso a non so come mettere il risultato della lista in un attributo del viewModel..sono così confuso: /
Rinesse

61
<%: 
     Html.DropDownListFor(
           model => model.Color, 
           new SelectList(
                  new List<Object>{ 
                       new { value = 0 , text = "Red"  },
                       new { value = 1 , text = "Blue" },
                       new { value = 2 , text = "Green"}
                    },
                  "value",
                  "text",
                   Model.Color
           )
        )
%>

oppure non puoi scrivere classi, metti qualcosa del genere direttamente alla vista.


2
Ricevo l'errore di seguito quando provo il tuo codice: "Riferimento oggetto non impostato su un'istanza di un oggetto".
Bashar Abu Shamaa,

12
cattiva idea di aggiungere la logica del modello alla tua vista
Daniël Tulp,

34

Evita molta diteggiatura grassa iniziando con un dizionario nel modello

namespace EzPL8.Models
{
    public class MyEggs
    {
        public Dictionary<int, string> Egg { get; set; }

        public MyEggs()
        {
            Egg = new Dictionary<int, string>()
            {
                { 0, "No Preference"},
                { 1, "I hate eggs"},
                { 2, "Over Easy"},
                { 3, "Sunny Side Up"},
                { 4, "Scrambled"},
                { 5, "Hard Boiled"},
                { 6, "Eggs Benedict"}
            };

    }


    }

Nella vista convertilo in un elenco per la visualizzazione

@Html.DropDownListFor(m => m.Egg.Keys,
                         new SelectList(
                             Model.Egg, 
                             "Key", 
                             "Value"))

32

Ciao, ecco come l'ho fatto in un progetto:

     @Html.DropDownListFor(model => model.MyOption,                
                  new List<SelectListItem> { 
                       new SelectListItem { Value = "0" , Text = "Option A" },
                       new SelectListItem { Value = "1" , Text = "Option B" },
                       new SelectListItem { Value = "2" , Text = "Option C" }
                    },
                  new { @class="myselect"})

Spero che aiuti qualcuno. Grazie


12

O se proviene da un contesto di database che puoi usare

@Html.DropDownListFor(model => model.MyOption, db.MyOptions.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }))

22
Per favore, non incoraggiare questo tipo di assurdità. Se ti piace fare riferimento al tuo contesto db nelle tue viste Razor che è su di te ma per quelli di noi che amano costruire software nel modo corretto, questa è un'idea terribile. Associa la vista Razor a una classe del modello di vista, tutti i dati necessari per la vista vengono archiviati in un'istanza del modello di vista creato dal controller. Questo è uno dei motivi per cui mi sto allontanando da .Net, troppi sviluppatori terribili che fanno cose terribili con il loro codice che creano enormi mal di testa per tutti gli altri. Scommetto che hai messo tutta la tua logica aziendale nei tuoi controller!
JBeckton,

7
Prima di tutto, scusami per eventuali errori grammaticali poiché l'inglese non è la mia prima lingua. È sempre bello vedere qualcuno fare un commento così approfondito, ti applaudo signore, che hai impiegato del tempo per contribuire. Inoltre è sempre rassicurante che la professione degli sviluppatori sia in buone mani come la tua, dal momento che la mia non lo farà. Mi piace del tuo commento ignorante è il motivo per cui non pubblico più qui. Posso informarvi che quando ho scritto questo sono stato 8 mesi nella mia istruzione e non avevo mai toccato lo sviluppo Web in anticipo. Volevo condividere un approccio diverso con la poca conoscenza che avevo.
Joel Wahlund,

7
8 mesi in? Allora perché provare a risolvere i problemi quando non si poteva sapere come? Il mio commento è tutt'altro che ignorante, vedo queste cose giorno dopo giorno. Devi iniziare a considerare la quantità di lavoro manuale che stai obbligando con i tuoi colleghi. immagina di avere un'applicazione enterprise con centinaia di visualizzazioni e il tuo CTO vuole passare a Oracle DB. Immagina il costo letterale del refactoring di tutte le viste e i controller che utilizzano gli elenchi a discesa solo a causa della tua riga di codice! Non sto cercando di insultarti, sto solo cercando di spiegarti come un piccolo consiglio negativo può avere effetti enormi.
JBeckton,

2
Non è diverso dalla necessità di riformattare le soluzioni basate sull'enumatica statica. Almeno non è stata una modifica del codice ogni volta che l'azienda ha voluto aggiungere un colore all'elenco. Se più persone pensassero di utilizzare effettivamente un database, il mondo sarebbe un posto migliore.
m12lrpv,

3
Bene, questo thread mi fa sorridere quando lo visito di tanto in tanto. Capisco il punto @SeanT un po 'meglio. Immagino di aver appena sentito un attacco in generale quando stavo cercando di aiutare. Oggi preferisco a me stesso mantenere tutto separato da livelli e non lasciare che nulla tocchi la vista a meno che non sia separata in ViewModels. È proprio come mi piace farlo da solo. Apprezzo m12lrpv portandomi in difesa tu :-)
Joel Wahlund

7

Con "Seleziona un articolo"

@Html.DropDownListFor(model => model.ContentManagement_Send_Section,
  new List<SelectListItem> { new SelectListItem { Value = "0", Text = "Plese Select one Item" } }
    .Concat(db.NameOfPaperSections.Select(x => new SelectListItem { Text = x.NameOfPaperSection, Value = x.PaperSectionID.ToString() })),
  new { @class = "myselect" })  

Derivato dai codici: Master Programmer && Joel Wahlund ;
Re Reference: https://stackoverflow.com/a/1528193/1395101 JaredPar ;

Grazie Master Programmer && Joel Wahlund && JaredPar ;

Buona fortuna amici


1
@using (Html.BeginForm()) {
    <p>Do you like pizza?
        @Html.DropDownListFor(x => x.likesPizza, new[] {
            new SelectListItem() {Text = "Yes", Value = bool.TrueString},
            new SelectListItem() {Text = "No", Value = bool.FalseString}
        }, "Choose an option") 
    </p>
    <input type = "submit" value = "Submit my answer" />
} 

Penso che questa risposta sia simile a quella di Berat, in quanto hai messo tutto il codice per il tuo DropDownList direttamente nella vista. Ma penso che questo sia un modo efficace per creare un elenco a discesa ay / n (booleano), quindi volevo condividerlo.

Alcune note per i principianti:

  • Non preoccuparti di come si chiama "x": viene creato qui, per la prima volta, e non si collega a nessun altro posto nell'app MVC, quindi puoi chiamarlo come desideri: "x", 'modello', 'm' ecc.
  • Il segnaposto che gli utenti vedranno nell'elenco a discesa è "Scegli un'opzione", quindi puoi cambiarlo se lo desideri.
  • C'è un po 'di testo che precede il menu a discesa che dice "Ti piace la pizza?"
  • Questo dovrebbe essere il testo completo di un modulo, incluso un pulsante di invio, credo

Spero che questo aiuti qualcuno,

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.