Wie schreibe ich eine einfache Html.DropDownListFor ()?

133

In ASP.NET MVC 2 möchte ich eine sehr einfache Dropdown-Liste schreiben, die statische Optionen enthält. Zum Beispiel möchte ich zwischen "Rot", "Blau" und "Grün" wählen.

Rinesse
quelle

Antworten:

188

Lesen Sie diesen MSDN-Artikel und eine Beispielverwendung hier zum Stapelüberlauf .

Angenommen, Sie haben die folgende Linq / POCO-Klasse:

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

Angenommen, Sie haben das folgende Modell:

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

Nehmen wir zum Schluss an, Sie haben die folgende Liste von Farben. Sie können aus einer Linq-Abfrage, einer statischen Liste usw. stammen.

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

In Ihrer Ansicht können Sie eine Dropdown-Liste wie folgt erstellen:

<%= Html.DropDownListFor(n => n.MyColorId, 
                         new SelectList(Colors, "ColorId", "Name")) %>
Evan Nagle
quelle
1
das ist wirklich klar. Ich möchte wissen, wo ich die IEnumerable <Color> in meinen Code einfügen soll. Ich weiß, dass es als Frage dumm erscheint, aber ich bin sehr verloren und neu darin: s
Rinesse
7
Keine Sorge, Freund. Ich weiß wie es sich anfühlt. :) Ist dies, wie Sie in Ihrer ersten Frage vorgeschlagen haben, eine statische Liste, die Sie im Code erstellen werden, oder werden Sie diese Liste aus einer Datenbank abrufen?
Evan Nagle
eine statische Liste, die 4 Optionen enthält, die keine Datenbank bilden
Rinesse
6
Erstellen Sie eine statische Klasse namens "HtmlLists" oder so. Platzieren Sie die statische Klasse im Namespace System.Web.Mvc. Fügen Sie in Ihrer statischen Klasse Ihre statische Liste der IEnumerable <Color> -Farben hinzu. Aus Ihrer Sicht können Sie darauf verweisen, indem Sie HtmlLists.Colors aufrufen. Hoffe das macht Sinn. Gib mir Bescheid. :)
Evan Nagle
2
Ich wusste nicht, wie es geht: '(... Ich weiß nicht, wo ich die Farbklasse und die HTML-Listen ablegen soll (im Modellordner möglicherweise?) Und wie ich in der Ansicht verweisen soll. Außerdem weiß ich nicht, wie ich sie platzieren soll das Ergebnis der Liste in einem Attribut des viewModel .. Ich bin so verwirrt: /
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
           )
        )
%>

oder Sie können keine Klassen schreiben, so etwas direkt in die Ansicht einfügen.

Berat
quelle
2
Beim Versuch Ihres Codes wird der folgende Fehler angezeigt: "Objektreferenz nicht auf eine Instanz eines Objekts festgelegt."
Bashar Abu Shamaa
12
schlechte Idee, Modelllogik zu Ihrer Ansicht hinzuzufügen
Daniël Tulp
34

Vermeiden Sie viel Fettfingern, indem Sie mit einem Wörterbuch im Modell beginnen

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

    }


    }

Konvertieren Sie es in der Ansicht in eine Liste zur Anzeige

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

Hallo, hier ist, wie ich es in einem Projekt gemacht habe:

     @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"})

Ich hoffe es hilft jemandem. Vielen Dank

Master-Programmierer
quelle
12

Oder wenn es aus einem Datenbankkontext stammt, den Sie verwenden können

@Html.DropDownListFor(model => model.MyOption, db.MyOptions.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }))
Joel Wahlund
quelle
22
Bitte ermutigen Sie diese Art von Unsinn nicht. Wenn Sie gerne in Ihren Razor-Ansichten auf Ihren Datenbankkontext verweisen, aber für diejenigen von uns, die Software auf die richtige Weise erstellen möchten, ist dies eine schreckliche Idee. Binden Sie Ihre Razor-Ansicht an eine Ansichtsmodellklasse. Alle für die Ansicht erforderlichen Daten werden in einer Instanz des vom Controller erstellten Ansichtsmodells gespeichert. Dies ist einer der Gründe, warum ich mich von .Net verabschiede. Zu viele schreckliche Entwickler machen schreckliche Dinge mit ihrem Code und bereiten allen anderen große Kopfschmerzen. Ich wette, Sie haben Ihre gesamte Geschäftslogik in Ihre Controller gesteckt!
JBeckton
7
Zunächst einmal entschuldigen wir uns für etwaige Grammatikfehler, da Englisch nicht meine Muttersprache ist. Es ist immer schön zu sehen, dass jemand einen so durchdachten Kommentar abgibt. Ich begrüße Sie, Sir, dass Sie sich die Zeit genommen haben, einen Beitrag zu leisten. Es ist auch immer beruhigend, dass der Beruf des Entwicklers in so guten Händen ist wie der Ihre, da meiner nicht ausreicht. Ihr ignoranter Kommentar ist der Grund, warum ich hier nie mehr poste. Darf ich Sie darüber informieren, dass ich, als ich dies schrieb, 8 Monate in meiner Ausbildung war und die Webentwicklung noch nie zuvor berührt hatte. Ich wollte einen anderen Ansatz mit dem geringen Wissen teilen, das ich hatte.
Joel Wahlund
7
8 Monate in? Warum dann versuchen, Probleme zu lösen, wenn Sie nicht wissen konnten, wie? Mein Kommentar ist alles andere als unwissend, ich sehe dieses Zeug Tag für Tag. Sie müssen anfangen, den Umfang der manuellen Arbeit zu berücksichtigen, die Sie Ihren Kollegen auferlegen. Stellen Sie sich vor, Sie haben eine Unternehmensanwendung mit Hunderten von Ansichten und Ihr CTO möchte zu Oracle DB wechseln. Stellen Sie sich die wörtlichen Kosten für die Umgestaltung aller Ansichten und Controller vor, die Dropdown-Listen verwenden, nur aufgrund Ihrer einzigen Codezeile! Ich versuche nicht, dich zu beleidigen, sondern dir nur zu erklären, wie ein kleiner schlechter Rat enorme Auswirkungen haben kann.
JBeckton
2
Nicht anders als die Notwendigkeit, die auf statischen Aufzählungen basierenden Lösungen umzugestalten. Zumindest war es nicht jedes Mal eine Codeänderung, wenn das Unternehmen der Liste eine Farbe hinzufügen wollte. Wenn mehr Menschen darüber nachdenken würden, tatsächlich eine Datenbank zu verwenden, wäre die Welt ein besserer Ort.
m12lrpv
3
Nun, dieser Thread zaubert ein Lächeln auf mein Gesicht, wenn ich ihn von Zeit zu Zeit besuche. Ich verstehe @ SeanT Punkt etwas besser. Ich glaube, ich habe mich im Allgemeinen nur angegriffen gefühlt, als ich versucht habe zu helfen. Ich ziehe es heutzutage vor, alles durch Ebenen getrennt zu halten und nichts die Ansicht berühren zu lassen, es sei denn, es ist in ViewModels getrennt. Es ist einfach so, wie ich es gerne selbst mache. Ich schätze m12lrpv, der mich zur Verteidigung nimmt, du :-)
Joel Wahlund
7

Mit "Bitte wählen Sie einen Artikel"

@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" })  

Abgeleitet von den Codes: Master Programmer && Joel Wahlund ;
King-Referenz: https://stackoverflow.com/a/1528193/1395101 JaredPar ;

Vielen Dank Master Programmer && Joel Wahlund && JaredPar ;

Viel Glück Freunde.

Amin Ghaderi
quelle
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" />
} 

Ich denke, diese Antwort ähnelt der von Berat, da Sie den gesamten Code für Ihre DropDownList direkt in die Ansicht einfügen. Aber ich denke, dies ist eine effiziente Möglichkeit, eine ay / n (boolesche) Dropdown-Liste zu erstellen, deshalb wollte ich sie teilen.

Einige Hinweise für Anfänger:

  • Machen Sie sich keine Sorgen darüber, wie 'x' heißt - es wird hier zum ersten Mal erstellt und ist nirgendwo anders in der MVC-App mit etwas anderem verknüpft, sodass Sie es so nennen können, wie Sie möchten - 'x', 'model', 'm' etc.
  • Der Platzhalter, den Benutzer in der Dropdown-Liste sehen, lautet "Wählen Sie eine Option". Sie können dies also ändern, wenn Sie möchten.
  • Vor dem Dropdown steht ein Text mit der Aufschrift "Magst du Pizza?"
  • Dies sollte ein vollständiger Text für ein Formular sein, einschließlich einer Schaltfläche zum Senden, denke ich

Hoffe das hilft jemandem,

user5138047
quelle