Jak napisać prostą Html.DropDownListFor ()?

132

W ASP.NET MVC 2 chciałbym napisać bardzo prostą listę rozwijaną, która zawiera statyczne opcje. Na przykład chciałbym zapewnić wybór między „czerwonym”, „niebieskim” i „zielonym”.

Rinesse
źródło

Odpowiedzi:

187

Zobacz ten artykuł MSDN i przykład użycia tutaj w przepełnieniu stosu .

Powiedzmy, że masz następującą klasę Linq / POCO:

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

Powiedzmy, że masz następujący model:

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

I na koniec powiedzmy, że masz następującą listę kolorów. Mogą pochodzić z zapytania Linq, z listy statycznej itp .:

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

W swoim widoku możesz utworzyć listę rozwijaną, taką jak:

<%= Html.DropDownListFor(n => n.MyColorId, 
                         new SelectList(Colors, "ColorId", "Name")) %>
Evan Nagle
źródło
1
to naprawdę jasne. Chciałbym wiedzieć, gdzie należy umieścić IEnumerable <Color> w moim kodzie? Wiem, że to wydaje się głupie jak pytanie, ale jestem bardzo zagubiony i nowy w tym: s
Rinesse
7
Nie martw się, przyjacielu. Wiem, jakie to uczucie. :) Jak zasugerowałeś w swoim początkowym pytaniu, czy jest to lista statyczna, którą utworzysz w kodzie, czy też będziesz pobierać tę listę z bazy danych?
Evan Nagle
statyczna lista zawierająca 4 opcje, które nie pochodzą z bazy danych
Rinesse,
6
Utwórz klasę statyczną o nazwie „HtmlLists” lub coś w tym stylu. Umieść klasę statyczną w przestrzeni nazw System.Web.Mvc. W klasie statycznej Dodaj statyczną listę kolorów IEnumerable <Color>. Następnie w swoim widoku możesz odwołać się do niego, wywołując HtmlLists.Colors. Mam nadzieję, że to ma sens. Daj mi znać. :)
Evan Nagle
2
Nie wiedziałem, jak to zrobić: '(... nie wiem, gdzie umieścić klasę Color i HtmlLists (w folderze modeli może być?) I jak odnieść się do widoku. Aloso a dont know how to put wynik listy w atrybucie widokuModel..Jestem taki zdezorientowany: /
Rinesse
64
<%: 
     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
           )
        )
%>

lub nie możesz pisać żadnych klas, wstaw coś takiego bezpośrednio do widoku.

Berat
źródło
2
Podczas wypróbowywania kodu pojawia się następujący błąd: „Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu”.
Bashar Abu Shamaa
14
zły pomysł, aby dodać logikę modelu do swojego widoku
Daniël Tulp
34

Unikaj grubego palcowania, zaczynając od słownika w modelu

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

    }


    }

W Widoku przekonwertuj go na listę do wyświetlenia

@Html.DropDownListFor(m => m.Egg.Keys,
                         new SelectList(
                             Model.Egg, 
                             "Key", 
                             "Value"))
Jules Bartow
źródło
32

Cześć, oto jak to zrobiłem w jednym projekcie:

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

Mam nadzieję, że to komuś pomoże. Dzięki

Mistrz programisty
źródło
12

Lub jeśli pochodzi z kontekstu bazy danych, którego możesz użyć

@Html.DropDownListFor(model => model.MyOption, db.MyOptions.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }))
Joel Wahlund
źródło
24
Proszę, nie zachęcaj do tego rodzaju bzdur. Jeśli lubisz odwoływać się do kontekstu db w swoich widokach Razor, który dotyczy ciebie, ale dla tych z nas, którzy lubią budować oprogramowanie we właściwy sposób, jest to okropny pomysł. Powiąż widok Razor z klasą modelu widoku, wszelkie dane potrzebne do widoku są przechowywane w wystąpieniu modelu widoku utworzonego przez kontroler. To jest jeden z powodów, dla których uciekam od .Net, ponieważ zbyt wielu okropnych programistów robi okropne rzeczy ze swoim kodem, sprawiających ból głowy wszystkim innym. Założę się, że całą logikę biznesową umieścisz w kontrolerach!
JBeckton,
7
Po pierwsze, przepraszam za jakiekolwiek błędy gramatyczne, ponieważ angielski nie jest moim pierwszym językiem. Zawsze miło jest widzieć, jak ktoś robi tak przemyślany komentarz. Brawo, sir, że poświęcił pan swój czas. Pocieszające jest również to, że zawód programisty jest w tak dobrych rękach, jak Twój, bo mój nie. Podobny do twojego ignoranckiego komentarza jest powodem, dla którego już nigdy nie piszę tutaj. Pragnę poinformować, że kiedy to pisałem, miałem 8 miesięcy nauki i nigdy wcześniej nie dotykałem tworzenia stron internetowych. Chciałem podzielić się innym podejściem z małą wiedzą, którą miałem.
Joel Wahlund
8
Za 8 miesięcy? W takim razie po co próbować rozwiązywać problemy, skoro nie mogłeś wiedzieć jak? Mój komentarz jest daleki od ignorancji, widzę te rzeczy dzień po dniu. Musisz zacząć rozważać ilość pracy fizycznej, jaką wykonujesz wobec swoich kolegów. wyobraź sobie, że masz aplikację korporacyjną z setkami widoków, a Twój dyrektor techniczny chce przejść na Oracle DB. Wyobraź sobie dosłowny koszt refaktoryzacji wszystkich widoków i kontrolerów, które używają list rozwijanych tylko ze względu na jeden wiersz kodu! Nie próbuję cię obrażać, tylko próbuję ci wytłumaczyć, jak mała zła rada może mieć ogromne skutki.
JBeckton
2
Nie różni się od konieczności refaktoryzacji rozwiązań opartych na statycznym wyliczeniu. Przynajmniej nie była to zmiana kodu za każdym razem, gdy firma chciała dodać kolor do listy. Gdyby więcej ludzi myślało o korzystaniu z bazy danych, świat byłby lepszym miejscem.
m12lrpv
4
Cóż, ten wątek wywołuje uśmiech na mojej twarzy, gdy odwiedzam go od czasu do czasu. Rozumiem trochę lepiej @SeanT. Chyba po prostu poczułem atak w ogóle, kiedy próbowałem pomóc. W dzisiejszych czasach wolę sam siebie, aby wszystko było oddzielone warstwami i nie pozwalałem, aby cokolwiek dotykało widoku, chyba że jest podzielone na ViewModels. Po prostu lubię to robić sam. Doceniam m12lrpv biorąc mnie w obronie :-)
Joel Wahlund
7

Z „Wybierz jeden element”

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

Pochodzi z kodów: Master Programmer && Joel Wahlund ;
Odniesienie do króla: https://stackoverflow.com/a/1528193/1395101 JaredPar ;

Dzięki Master Programmer && Joel Wahlund && JaredPar ;

Powodzenia przyjaciele.

Amin Ghaderi
źródło
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" />
} 

Myślę, że ta odpowiedź jest podobna do odpowiedzi Berata, ponieważ umieszczasz cały kod swojej DropDownList bezpośrednio w widoku. Ale myślę, że jest to skuteczny sposób tworzenia rozwijanej listy ay / n (boolean), więc chciałem się nią podzielić.

Kilka uwag dla początkujących:

  • Nie martw się, jak nazywa się „x” - jest on tworzony tutaj, po raz pierwszy i nie łączy się z niczym innym w aplikacji MVC, więc możesz to nazwać, jak chcesz - „x”, „model”, „m” itp.
  • Symbol zastępczy, który użytkownicy zobaczą na liście rozwijanej, to „Wybierz opcję”, więc możesz to zmienić, jeśli chcesz.
  • Przed menu rozwijanym znajduje się fragment tekstu z napisem „Lubisz pizzę?”
  • Myślę, że powinien to być pełny tekst formularza, w tym przycisk przesyłania

Mam nadzieję, że to komuś pomoże

user5138047
źródło