Html.DropdownListFor wybrana wartość nie została ustawiona

99

Jak mogę ustawić wybraną wartość Html.DropDownListFor? Rozejrzałem się po Internecie i zauważyłem, że można to osiągnąć za pomocą czwartego parametru, tak jak poniżej:

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")

Moja lista wyboru zostanie wyświetlona w następujący sposób:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

Ale z jakiegoś powodu Wielka Brytania pozostaje wybrana, ale chcę, aby zostało wybrane "Proszę wybrać kraj".

Czy ktoś wie, jak mogę to osiągnąć?

EDYTOWAĆ

Zaktualizowałem mój kod, ponieważ nastąpiła niewielka zmiana w funkcjonalności, ale nadal wydaje się, że napotyka ten problem. Oto, co moim zdaniem:

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

1to identyfikator tego, optionktóry chcę wybrać, próbowałem też z tekstem, optionale to też nie działa.

Jakieś pomysły?

Ibrar Hussain
źródło

Odpowiedzi:

183

Twój kod ma pewne problemy koncepcyjne:

Po pierwsze ,

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

W przypadku korzystania z DropDownListFor pierwszym parametrem jest właściwość, w której wybrana wartość jest przechowywana po przesłaniu formularza. Więc w twoim przypadku powinieneś mieć SelectedOrderIdjako część swojego modelu lub coś w tym stylu, aby użyć go w ten sposób:

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

Po drugie ,

Oprócz używania ViewBag, to nie jest złe, ale są lepsze sposoby (zamiast tego umieść te informacje w ViewModel), występuje „mały błąd” (lub nieoczekiwane zachowanie), gdy właściwość ViewBag, w której trzymasz SelectList, jest ta sama nazwa nieruchomości, w której umieściłeś wybraną wartość. Aby tego uniknąć, po prostu użyj innej nazwy podczas nazywania właściwości przechowującej listę elementów.

Jakiś kod, którego użyłbym na twoim miejscu, aby uniknąć tych problemów i napisać lepszy kod MVC:

Viewmodel:

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Other properties you need in your view
}

Kontroler:

public ActionResult MyAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Other initialization code

   return View(model);
}

W Twoim widoku:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")
Romias
źródło
44
Saved my day: "... jest mały błąd, gdy twoja właściwość ViewBag, w której trzymasz SelectList, ma tę samą nazwę właściwości, w której umieszczasz wybraną wartość. Aby tego uniknąć, po prostu użyj innej nazwy podczas nadawania nazwy właściwości listę przedmiotów. ” Dziękuję Ci!
Michael A. Volz aka Flynn
4
Ten „mały błąd” to absolutne szaleństwo! Właśnie zmarnowałem przez to 2 godziny mojego życia. Jak coś tak oczywistego może nadal istnieć i nie zostać naprawione?
cen
1
Flynn, twój komentarz powinien być odpowiedzią. Próbowałem szalonych implementacji, aby moja lista rozwijana działała i to było proste rozwiązanie
Dwayne Hinterlang
2
jest mały błąd ? To wcale nie jest błąd. Powiązanie modelu działa przez powiązanie z wartością właściwości i po powiązaniu z OrderTemplatespróbą powiązania z ViewBagwłaściwością typu IEnumerabe<SelectListItem>. Ale <select>element nie może być powiązany z kolekcją złożonych obiektów (tylko typ wartości)
O cholera, zmarnowałbym cały dzień, gdyby nie ta odpowiedź. Poważnie, ten LITTLE BUG jest powodem, dla którego powinniśmy wyskoczyć za torbę
Worthy7
23

U mnie nie działało, więc działało w ten sposób:

Kontroler:

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);

Widok:

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)

JQuery:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});
VINICIUS SIN
źródło
2
Twój kontroler ma nieprawidłową liczbę nawiasów: ma jeden nawias otwierający i dwa nawiasy zamykające.
Amos Long,
7

Kiedy mijasz taki obiekt:

new SelectList(Model, "Code", "Name", 0)

mówisz: źródło ( Model) i klucz ( "Code") tekst ( "Name") i wybrana wartość 0. Prawdopodobnie nie masz 0w źródle wartości Codewłaściwości, więc pomocnik HTML wybierze pierwszy element do przekazania rzeczywistej selectedValue do tej kontrolki.

Felipe Oriani
źródło
3

Przed przypisaniem upewnij się, że wybrana wartość została przycięta.

//Model

public class SelectType
{
    public string Text { get; set; }
    public string Value { get; set; }
}

//Kontroler

var types = new List<SelectType>();
types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;

//Widok

@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })
Nalan Madheswaran
źródło
2

Jeśli wiesz, co będzie w widoku, możesz również ustawić wartość domyślną z Kontrolera, a następnie ustawić ją w pliku view / cshtml. Nie ma potrzeby ustawiania wartości domyślnej od strony HTML.

W pliku kontrolera.

commission.TypeofCommission = 1;
return View(commission);

W pliku .cshtml.

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")
Smit Patel
źródło
1

Powinieneś zapomnieć o klasie

SelectList

Użyj tego w swoim kontrolerze:

var customerTypes = new[] 
{ 
    new SelectListItem(){Value = "all", Text= "All"},
    new SelectListItem(){Value = "business", Text= "Business"},
    new SelectListItem(){Value = "private", Text= "Private"},
};

Wybierz wartość:

var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
    selectedCustomerType.Selected = true;

Dodaj listę do ViewData:

ViewBag.CustomerTypes = customerTypes;

Użyj tego w swoim widoku:

@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)

-

Więcej informacji: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc

g. breeze
źródło
0

Dodaj sekcję kontrolera

  ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);

Dodaj sekcję HTML

   @Html.DropDownList("Orders", null)

Prosta metoda

ibrahim ozboluk
źródło
Łatwe alternatywne przetwarzanie transakcji
ibrahim ozboluk
0

U mnie ogólne rozwiązanie :)

@{
     var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
     if (selectedCity != null)
     { 
         @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
     }
     else
     { 
         @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
     }
}
Hamit YILDIRIM
źródło
0

Linq to Dropdown z pustą pozycją, wybraną pozycją (działa w 100%)
(Silnie wpisana, minimalne szanse na błąd) Wszelkie zmiany modelu zostaną odzwierciedlone w powiązaniu

Kontroler

public ActionResult ManageSurveyGroup()
    {
        tbl_Survey sur = new tbl_Survey();
        sur.Survey_Est = "3";

        return View(sur);
    }

Widok

        @{


    //Step One : Getting all the list
    var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();

    //Step Two  : Adding a no Value item **
    CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });

    //Step Three : Setting selected Value if value is present
    var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });

        }
        @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
        @Html.ValidationMessageFor(model => model.Survey_Est)

Ta metoda wiązania danych jest również możliwa

var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });

źródło
var selList = CompTypeList.Select (s => new SelectListItem {Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString (), Selected = s.CompTyp_Id == 3? true: false});
0

Wiem, że tak naprawdę nie jest to odpowiedź na pytanie, ale szukałem sposobu na zainicjowanie DropDownList z listy w locie w widoku, gdy natknąłem się na ten post.

Mój błąd polegał na tym, że próbowałem utworzyć SelectList ze słownika w następujący sposób:

//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...

Następnie poszukałem oficjalnego dokumentu msdn i stwierdziłem, że DropDownListForniekoniecznie wymaga to SelectList, ale raczej IEnumerable<SelectListItem>:

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })

W moim przypadku prawdopodobnie mogę również pominąć Model.Localityjako wybraną pozycję, ponieważ jest to a) jedyna pozycja ib) już jest napisana we SelectListItem.Selectedwłaściwości.

Na wszelki wypadek, gdy się zastanawiasz, źródłem danych jest strona AJAX, która jest ładowana dynamicznie za pomocą kontrolki SelectWoo / Select2.

Damian Vogel
źródło
0
public byte UserType
public string SelectUserType

Musisz zdobyć jeden i ustawić inny. Wybrana wartość nie może być tą samą pozycją, którą zamierzasz ustawić.

@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))

Używam słownika Enum do mojej listy, dlatego jest para „klucz” i „wartość”.

MEO
źródło
0

Miałem podobny problem, używałem ViewBag i nazwy elementu tak samo. (Błąd pisowni)

Arun Prasad ES
źródło
0

To są kwestie CSS. Nie wiem, dlaczego @ Html.DropDownListFor w Bootstrap 4 działa. Z pewnością jest to problem z projektowaniem klasowym. W każdym razie praca jest taka, jeśli twoje pole wprowadzania rozwijanego ma dopełnienie CSS: #px, # px; element, a następnie wyłącz go. Mam nadzieję, że to zadziała.

naz hassan
źródło