2010-03-07 14 views
12

Próbuję zrozumieć, jak najlepiej wdrożyć DropDownList w ASP.NET MVC 2 przy użyciu pomocnika DropDownListFor. To wieloczęściowe pytanie.Najlepszy sposób implementacji DropDownList w ASP.NET MVC 2?

Po pierwsze, jaki jest najlepszy sposób przekazania danych z listy do widoku?

  1. Przepuścić listę w modelu z właściwością SelectList zawierającego dane
  2. Przepuścić listę w poprzez ViewData

Jak uzyskać pustą wartość w DropDownList? Czy powinienem go wbudować w SelectList, gdy go tworzę, czy jest jakiś inny sposób, aby powiedzieć pomocnikowi, aby automatycznie utworzyć pustą wartość?

Na koniec, jeśli z jakiegoś powodu wystąpił błąd po stronie serwera i muszę ponownie wyświetlić ekran za pomocą DropDownList, czy muszę ponownie pobierać wartości z listy, aby przejść do modelu widoku? Te dane nie są utrzymywane między postami (przynajmniej nie wtedy, gdy przekazuję je za pośrednictwem mojego modelu widoku), więc chciałem po prostu pobrać go ponownie (jest on buforowany). Czy poprawiam to poprawnie?

Odpowiedz

9

Najprościej jest utworzyć SelectList w kontroler - używać metody rozszerzenie tutaj: http://blog.wekeroad.com/2010/01/20/my-favorite-helpers-for-aspnet-mvc

Pop że w ViewData przy użyciu tego samego klucza jak nazwisko własności: ViewData["statusid"]=MySelectList

Następnie wystarczy użyć Html.DropDownFor(x=>x.StatusID) i wszystko gotowe.

+1

Problem z użyciem ViewData polega na tym, że kontroler jest o wiele trudniejszy w testowaniu. Jeśli zachowasz wszystko w ViewModelu, twoje testy będą znacznie lepsze. – Mac

+2

W rzeczywistości nie różni się wcale - z ViewModel trzeba spelunk ViewData.Model, w przeciwnym razie po prostu poprosić o to za pomocą klucza. Bez żadnej różnicy ... –

+0

http://stackoverflow.com/a/5177332/986862 –

0

(Wiesz to już!)

  1. Przepuścić listę w modelu z właściwością selectList zawierającego dane

Tak, dodaj go podczas budowania SelectList. (Jeśli zbudujesz listę przy użyciu LINQ, może Ci się przydać Union.)

Tak, zrób i tak.

3

Odpowiadając na części:

  1. Najlepszym sposobem IMHO jest przekazać listę w ViewModel jak ten:

    public SelectList Colors 
    { 
        get 
        { 
         // Getting a list of Colors from the database for example... 
         List<Color> colors = GetColors().ToList(); 
    
         // Returning a SelectList to be used on the View side 
         return new SelectList(colors, "Value", "Name"); 
        } 
    } 
    
  2. dostać pusty lub domyślną opcję podobnego (- Pick kolor -), możesz to zrobić po stronie widoku:

    @Html.DropDownListFor(m => m.Color, Model.Colors, "-- Pick a color --") 
    
  3. Będziesz musiał pobrać/wypełnić listę ponownie, jeśli jest częścią ViewModel.


Spójrz na poniższym blogu.To może dać Ci kilka wskazówek:

Drop-down Lists and ASP.NET MVC

2

Można zrobić coś takiego:

<%= Html.DropDownListFor((x => x.ListItems), Model.ListItems, "")%> 

lub

<%= Html.DropDownList("ListItems", Model.ListItems, "")%> 

The ostatniego param 'optionLabel' sprawia, że ​​pusty element Lista

W tym przypadku można zobaczyć ListItems jest właściwością modelu.

Uczyniłem widok mocno wpisany również do modelu.

0

Uważam, że bardziej intuicyjne jest pracować z sekwencją SelectListItems (a nie SelectList).

Na przykład utworzyłoby to IEnumerable<SelectListItem> z sekwencji obiektów klienta, które można przekazać do helpera Html.DropDownListFor (...). Właściwość "Wybrane" opcjonalnie ustawi domyślny element na liście rozwijanej.

var customers = ... // Get Customers 
var items = customers.Select(c => new SelectListItem 
          { 
           Selected = (c.Id == selectedCustomerId), 
           Text = c.Email, 
           Value = c.Id.ToString() 
          }); 
Powiązane problemy