2009-05-15 14 views
14

Chciałbym przypisać statyczną listę elementów w SelectList() do Html.DropDownList() w ASP.NET MVC, jaka jest najlepsza praktyka?Jak dodać statyczną listę elementów w MVC Html.DropDownList()

miałem spróbować znaleźć sposób na wykorzystanie new SelectList(new {key = "value"}... ale jeden, który nie działa, a dwa, że ​​będę łamiąc ustawę tutaj, moja lista powinna być zadeklarowana w statycznej ViewData tak i przekazywane jako IList/IENumerable?

Odpowiedz

3

OK postanowiłem wziąć własne rady, a to powinno być określone w kontrolerze:

FYI, właśnie wrócił:

PageData data = new PageData() 
      { 
       Formats = new[] 
          { 
           new { ID = "string", Name = "Text" }, 
           new { ID = "int", Name = "Numeric" }, 
           new { ID = "decimal", Name = "Decimal" }, 
           new { ID = "datetime", Name = "Date/Time" }, 
           new { ID = "timespan", Name = "Stopwatch" } 
          }, 
       ............. 

      }; 
return View(data); 

... (zignorować kontekstu) oraz w Widoku Strona ASPX:

<%= Html.DropDownList("type.field", new SelectList(ViewData.Model.Formats, "ID", "Name"... 

Jeśli ktoś ma bardziej optymalny sposób robienia tego, chętnie zaakceptuję ich odpowiedź.

+0

Wybrałem moją odpowiedź, ponieważ jest to ta, którą wybrałem. – GONeale

+0

Działa to dobrze, ale jeśli chcę, aby lista rozwijana ładowała wartość dziesiętną jako wartość początkową, co powinienem zrobić? – Sakthivel

23

Najlepiej jest nie tworzyć listy wyboru w widoku. Powinieneś go utworzyć w kontrolerze i przekazać go za pomocą ViewData.

przykład:

var list = new SelectList(new [] 
              { 
               new {ID="1",Name="name1"}, 
               new{ID="2",Name="name2"}, 
               new{ID="3",Name="name3"}, 
              }, 
          "ID","Name",1); 
      ViewData["list"]=list; 
      return View(); 

przechodzą do konstruktora: IEnumerable obiektu, pole wartość pola tekstowe jak i wybraną wartość.

w Widoku:

<%=Html.DropDownList("list",ViewData["list"] as SelectList) %> 
+0

uzgodniono z Marwan. Utwórz obiekt SelectList i przekaż go do swojego widoku. Osobiście miałbym mocno wpisane poglądy, ale to jest poza zakresem tego pytania. –

+0

Używam mocno wpisanego widoku, dlaczego miałbyś zdefiniować SelectList w widoku? To jest "widok-szczególne" rzeczy? Sądzę, że lepiej byłoby po prostu ujawnić dane, to jest to, co ma dać widok, dane, a nie kontekst i dane. – GONeale

+0

Właściwie to myślę, że jest bardzo źle, SelectList służy do renderowania listy rozwijanej, która jest całkowicie specyficzna dla interfejsu użytkownika. Co się stanie, jeśli chcę teraz użyć tych danych do listy wyboru lub czegoś, co nie obsługuje SelectList? – GONeale

11

Wszystkie noobs MVC początkowo uniknąć „M” słowa, ale ma trochę zacząć na początku akronimem MVC. Może więc, po prostu, może chcesz zacząć swoje rozwiązanie od Modelu ... po prostu mówiąc.

Nie powtarzaj się (DRY). Kończysz kopiowanie i wklejanie "nowej PageData()" do każdego kontrolera, który przejdzie z listy opcji do widoku. Następnie będziesz chciał usunąć lub dodać opcję i edytować wszystkie PageData każdego kontrolera.

Co więcej, chcesz wpisać najmniejszą ilość kodu z najmniejszą liczbą niepotrzebnych "dodatkowych", "nowych", "IS" i "Nazw". Ponieważ masz tylko parę klucz-wartość w opcji select (i/lub listę przycisków opcji), użyj najlżejszej struktury danych, np. Dictionary - w swoim Modelu.

Następnie wystarczy odwołać się do modelu w kontrolerze i przekonwertować słownik na listę SelectList w widoku za pomocą metody DropDownListFor zawierającej wyrażenie LINQ Lambda.

Zastraszani? Nie jesteś sam. Z pewnością byłam. Oto przykład kiedyś nauczyć sobie z M, V i C:

modelu część MVC:

using System.Web.Security; 
using System.Collections.Generic; 
using System.Text; 
using System.Linq.Expressions; 
using System.Web.Routing; 
using System.Web.Helpers; 
using System.Web.Mvc.Html; 
using MvcHtmlHelpers; 
using System.Linq; 

// EzPL8.com is the company I work for, hence the namespace root. 
    // EzPL8 increases the brainwidths of waiters and bartenders by augmenting their "memories" with the identifies of customers by name and their food and drink preferences. 
    // This is pedagogical example of generating a select option display for a customer's egg preference. 

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

     public MyEggs() //constructor 
     { 
      Egg = new Dictionary<int, string>() 
      { 
       { 0, "No Preference"}, //show the complete egg menu to customers 
       { 1, "I hate eggs"}, //Either offer an alternative to eggs or don't show eggs on a customer's personalized dynamically generated menu 

       //confirm with the customer if they want their eggs cooked their usual preferred way, i.e. 
       { 2, "Over Easy"}, 
       { 3, "Sunny Side Up"}, 
       { 4, "Scrambled"}, 
       { 5, "Hard Boiled"}, 
       { 6, "Eggs Benedict"} 
      }; 
    } 
} 

Sterownik jest dość prosta, po prostu przekazując model. Pozwala uniknąć tworzenia izolowanej koncepcji, która prawdopodobnie nie jest izolowana tylko na jedną stronę.:

public ActionResult Index() 
{ 
    var model = new EzPL8.Models.MyEggs(); 
    return View(model); 
} 

The View wykorzystuje DropDownListFor (zamiast DropDownList) i wyrażenia lambda silnego typowania w refaktoringu zdarzenia jest wymagany:

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

voila, uzyskany HTML:

<select id="Egg" name="Egg"> 
<option value="0">No Preference</option> 
<option value="1">I hate eggs</option> 
<option value="2">Over Easy</option> 
<option value="3">Sunny Side Up</option> 
<option value="4">Scrambled</option> 
<option value="5">Hard Boiled</option> 
<option value="6">Eggs Benedict</option> 
</select> 

Uwaga: nie należy mylić wartości VALUE w <option value="6">, która jest kluczem ze słownika, z "Wartości" w SelectList(), która jest tekstem/tytułem (np. Eggs Benedict) t kapelusz kończy się między tagami opcji.

Use Case: Aby zminimalizować ruch pomiędzy aplikacją a bazą danych stworzyłem listę statycznej aby uniknąć zapytania do bazy danych dla rozwijanej listy, które rzadko, jeśli w ogóle zmienia się w dół. Zmiana jest jednak nieunikniona, a za sześć miesięcy umiera restauracja w restauracji mojego klienta; nie z powodu zielonej szynki, ale dlatego, że uczulili się na jajka, a kucharz mieszał się trochę z goframi.

Restauracja potrzebuje zaktualizowanych informacji o klientach, aby natychmiast uwzględnić alergie pokarmowe. Mimo że uwielbiają powtarzających się klientów, nie są w porządku, gdy martwi klienci wracają jako zombie, których nie można płacić, ponieważ ich karty kredytowe zostały anulowane.

Pytanie retoryczne: Czy należy zmodyfikować wszystkie kontrolery i widoki związane z preferencjami dotyczącymi jaj klienta? Lub po prostu wstaw {7, "Alergiczne do jajek"} do modelu?

Kolejne pytanie retoryczne: Czy jajka nie są omletami? Czy chcesz dodać {8, "Omelette, Western"}, {9, "Omelette, Mushroom-Feta-Spinach"} raz do modelu i mieć nowe dodatki automagicznie propagować na wszystkich listach rozwijanych we wszystkich widokach, które ich używają ?

linia dolna (e) Jest to prawdopodobnie bardziej niż prosiłeś ... ale nie powiedzieć MVC, nie tylko VC:
1. użyć modelu w * M * VC. 2. Użyj słownika w Modelu, gdy lista wyboru opiera się wyłącznie na "kluczu podstawowym" i tytule. 3. Jeśli Twoja statyczna lista nie jest zgodna z tabelą odnośników do bazy danych, prawdopodobnie Twoja aplikacja nie jest zbyt przydatna. Po dodaniu opcji do listy statycznej najprawdopodobniej trzeba będzie również wstawić wstawkę do tabeli wyszukiwania, aby uniknąć błędu integralności relacji klucz główny/klucz obcy z innymi tabelami w bazie danych. 4. Użyj lambda i silnie typograficznych struktur danych, aby uniknąć błędów i uzyskać wsparcie dla typu.

+0

Co zawiera wszystkie referencje 'EzPL8'? Zgubiłem się ... czy też brakuje mi dowcipu? –

+1

-1 dla historii EzPL8. +1 za wyciągnięcie danych z Modelu. –

Powiązane problemy