Używam metody pomocnika DropDownListFor na stronie edycji i nie mam szczęścia, aby wybrać wartość, którą określam. Zauważyłem podobne pytanie na Stackoverflow. Sugerowanym sposobem obejścia tego problemu było „wypełnienie SelectList w kodzie widoku”. Problem w tym, że już tego próbowałem i nadal nie działa.
<%= Html.DropDownListFor(model => model.States, new SelectList(Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>
Ustawiłem punkt przerwania i zweryfikowałem istnienie (i ważność) modelu.AddressStateAbbr. Po prostu nie jestem pewien, czego mi brakuje.
źródło
@Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
Próbować:
<%= Html.DropDownListFor( model => model.AddressStateAbbr, new SelectList( Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>
lub w składni Razor:
@Html.DropDownListFor( model => model.AddressStateAbbr, new SelectList( Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")
Pomocnicy oparte na wyrażeniach nie wydają się przestrzegać właściwości Selected SelectListItems w SelectList.
źródło
Jeśli robisz to poprawnie i używasz modelu - w przeciwieństwie do wszystkich tych dziwaków z ViewBag - i nadal widzisz problem, to dlatego, że
@Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)
nie można dopasowaćMyValue
do wyborów, które maMyOptions
. Dwie potencjalne przyczyny to:MyValue
jest null. Nie ustawiłeś tego w swoim ViewModel. Tworzenie jednego zMyOptions
plikówSelected=true
nie rozwiąże tego.MyValue
jest inny niż w typachMyOptions
. Więc na przykład, jeśliMyValue
jest(int) 1
, aleMyOptions
jesteś listą wypełnionych ciągów{"01", "02", "03", ...}
, oczywiście niczego nie wybierze.źródło
<option value="2">some text</option>
. Wygląda na to, że w rzeczywistości próbuje dopasować właściwość modelu widoku do wyświetlanego tekstu, a nie atrybut wartości, aby wybrać wybraną opcję. To sprawiło, że odeszłam na chwilę.Nie odpowiadając na to pytanie - może pomóc przyszłym pracownikom Google, jeśli podążą moją ścieżką myślową:
Chciałem wielokrotnego wyboru, a ten atrybut hack na DropDownListFor nie był wybierany automatycznie
Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })
zamiast tego powinienem był użyć ListBoxFor, który sprawił, że wszystko działało
Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)
źródło
Mam podobny problem i rozwiązuję go w następujący sposób, ustawiam plik
model.States na kontrolerze na to, co należy wybrać
model.States = "Kalifornia"
a wtedy otrzymasz „California” jako wartość domyślną.
źródło
ten problem jest powszechny. zmień nazwę właściwości widoku na inną niż nazwa zmiennej modelu używanej na stronie.
źródło
Inną rzeczą do sprawdzenia, czy to nie cały Twój własny kod, jest upewnienie się, że nie ma funkcji javascript zmieniającej wartość podczas ładowania strony. Po godzinach uderzania głową o ścianę czytając wszystkie te rozwiązania, odkryłem, że tak właśnie się ze mną dzieje.
źródło
Niedawno napotkałem ten problem. Doprowadzało mnie to do szału przez około godzinę. W moim przypadku nie używałem
ViewBag
zmiennej o takiej samej nazwie jak właściwość modelu.Po prześledzeniu zmian kontroli źródła problemem okazało się to, że moja akcja miała argument o tej samej nazwie, co właściwość model:
public ActionResult SomeAction(string someName) { var model = new SomeModel(); model.SomeNames = GetSomeList(); //Notice how the model property name matches the action name model.someName = someName; }
W widoku:
@Html.DropDownListFor(model => model.someName, Model.SomeNames)
Po prostu zmieniłem argument akcji na inną nazwę i znowu zaczęło działać:
public ActionResult SomeAction(string someOtherName) { //.... }
Przypuszczam, że można by również zmienić nazwę właściwości modelu, ale w moim przypadku nazwa argumentu jest bez znaczenia, więc ...
Miejmy nadzieję, że ta odpowiedź zaoszczędzi kłopotu komuś innemu.
źródło
Przynajmniej dla mnie problem był związany z
IEnumerable<T>
.Zasadniczo zdarzyło się, że widok i model nie mają tego samego odniesienia dla tej samej właściwości.
Jeśli to zrobisz
IEnumerable<CoolName> CoolNames {get;set;} = GetData().Select(x => new CoolName{...});}
Następnie powiąż to za pomocą
@Html.DropDownListFor(model => model.Id, Model.CoolNames)
Widok gubi właściwość CoolNames, prostą poprawką jest dodanie
.ToList()
Po wykonaniu projekcji (.Select()
);).źródło
Miałem ten sam problem. W poniższym przykładzie zmienna ViewData ["DATA_ACREDITO_MODELO_INTEGRADO"] ma listę SelectListItem z domyślnie wybraną wartością, ale taki atrybut nie jest odzwierciedlany wizualnie.
// data var p_estadoAcreditacion = "NO"; var estadoAcreditacion = new List<SelectListItem>(); estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)" , Value = " " }); estadoAcreditacion.Add(new SelectListItem { Text = "SI" , Value = "SI" }); estadoAcreditacion.Add(new SelectListItem { Text = "NO" , Value = "NO" }); if (!string.IsNullOrEmpty(p_estadoAcreditacion)) { estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true; } ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;
Rozwiązałem to, różnicując pierwszy argument DropdownList od atrybutu id.
// error: @Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO" , ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem> , new { id = "SELECT__ACREDITO_MODELO_INTEGRADO" ... // solved : @Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO" , ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem> , new { id = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
źródło
Wiem, że to stare pytanie, ale miałem ten sam problem w 2020 roku.
Okazuje się, że problem polegał na tym, że właściwość modelu nosiła nazwę „Tytuł”. Zmieniłem jej nazwę na „GivenTitle” i teraz działa zgodnie z oczekiwaniami.
Od
Html.DropDownListFor(m => m.Title, Model.Titles, "Please Select", new { @class = "form-control" })
do
Html.DropDownListFor(m => m.GivenTitle, Model.GivenTitles, "Please Select", new { @class = "form-control" })
źródło