2009-02-24 20 views
6

Używam ASP MVC RC1.Jak ustawić wartość domyślnej opcji za pomocą Html.DropDownList

Formularz, którego używam, zawiera listę rozwijaną, którą umieściłem w widoku z tym kodem.

<%= Html.DropDownList("areaid", (SelectList)ViewData["AreaId"], "Select Area Id")%> 

jednak przy wytapianiu, to co mam

<select id="areaid" name="areaid"> 
    <option value="">Select Area Id</option> 
    <option value="1">Home</option> 
    ... 
</select> 

Co chciałbym to dla opcji Wybierz obszar Id mieć wartość 0 i oznaczyć ją jako domyślnie zaznaczone tak jest zgodny z innymi wartościami i mogę sprawdzić, czy wybrano obszar, czy nie, ponieważ jest to wartość obowiązkowa. AreaId jest liczbą całkowitą, więc kiedy aktualnie klikam formularz bez dotykania listy rozwijanej, MVC skarży się, że "" nie jest liczbą całkowitą i daje mi błąd wiązania.

W jaki sposób ustawić wartość domyślnej opcji, a następnie wybrać ją w formularzu?

Dzięki, Dan

Odpowiedz

21

Chyba masz trzy cztery opcje. Najpierw, gdy budujesz swoją listę SelectList lub wyliczasz z SelectItemList, poprzedzaj wybór etykietą opcji i wartością domyślną. Umieszczenie go na górze spowoduje, że będzie on domyślny, jeśli inna wartość nie jest już wybrana w modelu. Po drugie, możesz utworzyć zaznaczenie (i opcje) "ręcznie" w widoku za pomocą pętli, aby utworzyć opcje. Znowu, poprzedzając wybór domyślny, jeśli nie ma go w modelu. Po trzecie, użyj rozszerzenia DropDownList, ale zmodyfikuj wartość pierwszej opcji za pomocą javascript po wczytaniu strony.

Nie wydaje się możliwe używanie rozszerzenia DropDownList do przypisania wartości opcji labelLabel, ponieważ jest ona zakodowana na stałe w celu użycia string.Empty. Poniżej znajduje się odpowiedni fragment kodu z http://www.codeplex.com/aspnet.

// Make optionLabel the first item that gets rendered. 
    if (optionLabel != null) { 
     listItemBuilder.AppendLine(ListItemToOption(new SelectListItem() { Text = optionLabel, Value = String.Empty, Selected = false })); 
    } 

EDIT: Wreszcie, najlepszym sposobem jest mieć model przybierać wartości pustych i oznaczyć go jako wymagany pomocą RequiredAttribute. Polecam używanie modelu widoku, a nie modelu encji dla widoku. Ponieważ wartość ma wartość Nullable, pusty ciąg będzie działał poprawnie, jeśli zostanie odesłany bez wybrania wartości. Ustawienie go jako wymaganej wartości spowoduje niepowodzenie sprawdzania poprawności modelu z odpowiednim komunikatem, że wymagana jest wartość. Umożliwi to korzystanie z helpera DropdownList w niezmienionej postaci.

public AreaViewModel 
{ 
    [Required] 
    public int? AreaId { get; set; } 

    public IEnumerable<SelectListItem> Areas { get; set; } 
    ... 
} 

@Html.DropDownListFor(model => model.AreaId, Model.Areas, "Select Area Id") 
+1

Dziękuję. Teraz utworzę obiekt List , wstaw domyślną opcję o wartości 0 w indeksie 0 i przekaż ją do Html.DropDownList. To działa przyjemność. – Hmobius

+0

Dzięki, że również mi pomogłeś! To smutne, że nawet przy MVC 3 nie można dodać wartości domyślnej:/ – LanFeusT

+0

@LanFeusT - odpowiedź została udzielona na długo przed MVC3. Zaktualizowałem go, aby uzyskać lepszą metodę radzenia sobie z nim z perspektywy modelu, szczególnie. z MVC3. – tvanfosson

3

Dla MVC3, SelectList ma przeciążenie, dzięki któremu można zdefiniować wybraną wartość.

Function Create() As ViewResult 

     ViewBag.EmployeeId = New SelectList(db.Employees, "Id", "Name", 1) 

     Return View() 

    End Function 

W tym przypadku, zdarza mi się, że 1 jest id elementu domyślnej listy chcę, ale prawdopodobnie można wybrać domyślne poprzez zapytania czy co tam pływa łodzią

+0

Działa to świetnie. Aby odpowiedzieć na pytanie Dana, wierzę, że on chce: –

0

Zamiast przejścia domyślny element z definicji w widoku, możesz dodać dane "Wybierz obszar" do 0. indeksu listy ze sterownika.

ten sposób dane Wybierz obszar ma wartość indeksu 0.

0

chciałem użyć tego samego SelectList dla wielu upadków spadek i nie chce powielać SelectList w modelu więc po prostu dodaje się nowy Metoda rozszerzenia html, która przyjęła wartość i ustawi wybraną pozycję.

public static MvcHtmlString DropDownList(this HtmlHelper htmlHelper, string name, string value, IList<SelectListItem> selectList, object htmlAttributes) 
{ 
    IEnumerable<SelectListItem> items = selectList.Select(s => new SelectListItem {Text = s.Text, Value = s.Value, Selected = s.Value == value}); 
    return htmlHelper.DropDownList(name, items, null /* optionLabel */, htmlAttributes); 
} 
Powiązane problemy