DropDownListFor Not Selecting Value

83

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.

senfo
źródło

Odpowiedzi:

184

Po godzinie poszukiwań znalazłem problem, który powoduje, że wybrane osoby nie są ustawione DropDownListFor. Powodem jest to, że używasz nazwy ViewBag takiej samej jak właściwość modelu.

Przykład

public  class employee_insignia
{ 
   public int id{get;set;}
   public string name{get;set;}
   public int insignia{get;set;}//This property will store insignia id
}

// If your ViewBag's name same as your property name 
  ViewBag.Insignia = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

Widok

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")

Wybrana opcja nie zostanie ustawiona na liście rozwijanej, ALE Po zmianie nazwy ViewBag na inną nazwę wybrana opcja będzie wyświetlana poprawnie.

Przykład

ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

Widok

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")
wut-excel
źródło
34
To jest właściwie poprawna odpowiedź !!! Wszystkim szukającym w Google upewnij się, że nazwa właściwości ViewBag nie jest taka sama jak właściwości modelu! Nie spodziewałem się, że to w ogóle ma znaczenie, ale naprawiło to. Jestem zszokowany.
Tesserex
10
Mam ten sam problem, mimo że właściwość ViewBag ma inną nazwę niż właściwość modelu:@Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
Paul Taylor
8
Czy ktoś zna powód, dla którego nie mogą być takie same? Ta odpowiedź uratowała mój laptop przed
rozbiciem
7
Nie rozumiem. Mam ten problem również i nie używamy ViewBag. Również pytanie nie dotyczyło ViewBag
George Mauer
3
Uważam to za błąd ASP.NET MVC!
Néstor Sánchez A.
30

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.

BnWasteland
źródło
Dzięki! Potrzebowałem szybkiego sposobu na pobranie wybranej wartości z repozytorium bazy danych! Model.AddressStateAbbr był częścią, której potrzebowałem. Słodkie.
Jeszcze
30

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ć MyValuedo wyborów, które ma MyOptions. Dwie potencjalne przyczyny to:

  1. MyValuejest null. Nie ustawiłeś tego w swoim ViewModel. Tworzenie jednego z MyOptionsplikówSelected=true nie rozwiąże tego.
  2. Bardziej subtelnie The typ z MyValuejest inny niż w typach MyOptions. Więc na przykład, jeśli MyValuejest (int) 1, ale MyOptionsjesteś listą wypełnionych ciągów {"01", "02", "03", ...}, oczywiście niczego nie wybierze.
Chad Hedgcock
źródło
4
Dziękuję bardzo za tę odpowiedź. Nie rozumiem też, dlaczego wszyscy używają ViewBag zamiast tworzenia odpowiedniego modelu widoku. Ta odpowiedź patrzyła mi w twarz i doceniam, że łączysz kropki.
Niejednoznaczności
2
# 2 Oto mój problem. Mam właściwość modelu, która jest typem delegata z niestandardowym spinaczem modelu, aby przyjąć nazwę metody i faktycznie powiązać tę metodę z listy wstępnie zdefiniowanych wywołań metod, które pasują do podpisu delegata. Czy ktoś znalazł sposób na obejście nr 2 i wybranie go poprawnie bez jakiegoś zhakowanego skryptu bocznego klienta?
mikeschuld
1
Podziękowania od innego hipstera, który używa View Models: D
Vladimir Bozic
1
Ponadto, do każdego, kto ma SelectList z atrybutu wartości innej niż wyświetlanego tekstu pomiędzy znacznikami opcji, na przykład: <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ę.
Jason Hanson
17

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)
placet
źródło
6
Podążałem za twoją ścieżką myśli. Świat: jeśli używasz DropDownListFor i wielu, zamierzałeś użyć ListBoxFor.
Scott Stafford
To denerwujące, że to działa. W innym miejscu w moim kodzie, gdzie wszystko jest takie samo, DropDownListFor działa dobrze. Spędziłem cztery lub pięć godzin, bawiąc się tym, żeby to zadziałało. Mój ostatni rów był taki i zadziałał.
Bryan Hobbs
1

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ą.

Prageeth godage
źródło
0

ten problem jest powszechny. zmień nazwę właściwości widoku na inną niż nazwa zmiennej modelu używanej na stronie.

Seliya Hilal
źródło
0

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.

BMills
źródło
0

Niedawno napotkałem ten problem. Doprowadzało mnie to do szału przez około godzinę. W moim przypadku nie używałem ViewBagzmiennej 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.

JuanR
źródło
0

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());).

jNi
źródło
0

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"

...

Pablo Alejandro Perez Acosta
źródło
0

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" })
Szymon
źródło