7

Używam DropDownListFor do renderowania listy rozwijanej w widoku. W jakiś sposób wyświetlana lista nie wybiera wartości SelectListItem z Selected ustawionej na true.ASP.NET MVC DropDownListFor nie honoruje SelectListItem.Selected

W akcji kontrolera:

var selectList = sortedEntries.Select(entry => new SelectListItem 
          { 
           Selected = entry.Value.Equals(selectedValue), 
           Text = entry.Value, 
           Value = entry.Id 
          }); 

return View(new DropDownListModel 
      { 
       ListId = id, 
       SelectList = selectList, 
       OptionLabel = "Click to Select" 
      }); 

W widoku:

<%= Html.DropDownListFor(m => m.ListId, 
    Model.SelectList, 
    Model.OptionLabel, 
    new {@class="someClass"}) %> 

Próbowałem następujące:

  1. upewnij się, że jest jeden i tylko jeden elementów z Selected ustawiona na true.
  2. usuń argument etykiety opcji.
  3. usunąć obiekt atrybutu HTML.
  4. użycie SelectList w DropDownListFor:

Html.DropDownListFor(m => m.ListId, 
     new SelectList(Model.SelectList, "Value", "Text", 
      new List<SelectListItem>(Model.SelectList).Find(s => s.Selected)), 
     new {@class="someClass"}) 

Wszelkie sugestie co do tego, co poszło nie tak?

EDIT:

więcej informacji:

  • Działanie to jest działanie dziecko, zwany przez innego widoku z HTML.RenderAction

Odpowiedz

4

Spróbuj tak:

var selectList = sortedEntries.Select(entry => new SelectListItem 
{ 
    Text = entry.Value, 
    Value = entry.Id 
}); 

return View(new DropDownListModel 
{ 
    // The drop down list is bound to ListId so simply set its value 
    // to some element value in the list and it will get automatically 
    // preselected 
    ListId = selectedValue, 
    SelectList = selectList, 
    OptionLabel = "Click to Select" 
}); 

i w widoku:

<%= Html.DropDownListFor(
    m => m.ListId, 
    new SelectList(Model.SelectList, "Value", "Text"), 
    Model.OptionLabel, 
    new { @class = "someClass" } 
) %> 

Może być jeszcze jeden komunikat: próbujesz zmienić wybraną wartość w akcji POST. Na przykład wyrenderowałeś formularz, użytkownik wybrał pewną wartość na liście rozwijanej, przesłał formularz, a w akcji POST wykonałeś trochę przetwarzania na tej wybranej wartości i gdy wyświetlisz widok, który chcesz, aby lista rozwijana miała inną wybraną wartość . W tym przypadku trzeba będzie usunąć wstępną selekcję, który jest zawarty w ModelState lub pomocnika html zignoruje wybraną wartość w modelu

// do this before returning the view and only if your scenario 
// corresponds to what I described above 
ModelState.Remove("ListId"); 
+0

ModelState.Remove ("ListId") jest kluczem. Dziękuję Ci. –

6

DropDownListFor zawsze wybrać wartość, że listbox jest na tak w tym przypadku przyjrzy się wartości ListId i sprawi, że pozycja na liście zostanie wybrana. Jeśli ListId nie zostanie znaleziony na liście, zostanie wybrany pierwszy element (lub domyślny tekst). Jeśli chcesz listę, która wybiera na podstawie wybranego atrybutu, użyj DropDownList (bez fora, w tym przypadku musisz podać nazwę samodzielnie).

Więc w twoim przypadku to będzie działać:

var selectList = sortedEntries.Select(entry => new SelectListItem 
{ 
    Text = entry.Value, 
    Value = entry.Id 
}); 

return View(new DropDownListModel 
{ 
    ListId = selectedValue, 
    SelectList = selectList, 
    OptionLabel = "Click to Select" 
}); 
+0

Skończyło się na użyciu 'DropDownList', który pozwala mi określić identyfikator dla kontroli wyboru, a także wybranej wartości w' SelectListItem'. Dziękuję za wyjaśnienie! –

5

mam ten sam problem na tym samym modelu (z innych modeli tej decyzji nie problem)

nie działa:

@Html.DropDownListFor(o => o.Drivers.ValueListItems.Value, Model.Drivers.ValueListItems, new { size = Model.Drivers.ValueSizeList, Multiple = "multiple" }) 

Działa doskonale, wybrane elementy:

@Html.DropDownListFor(o => o.Drivers.ValueListItems.ToDictionary(u=>u.Value).Values, Model.Drivers.ValueListItems, new { size = Model.Drivers.ValueSizeList, Multiple = "multiple" }) 
+0

Jedynym problemem jest to, że nazwą kontrolki będą teraz "Wartości". –

0

Rozwiązanie tego problemu jest prostsze niż my wszyscy myślimy ...

Wszystko, co musimy zrobić, to ustawić właściwość w modelu widoku dla elementu, do którego rozwijane jest ograniczenie - np: ListId = 3 dla przykładem

ten sposób, gdy robimy to

Html.DropDownListFor(m => m.ListId, 
    new SelectList(Model.SelectList, "Value", "Text", 
     new List<SelectListItem>(Model.SelectList).Find(s => s.Selected)), 
    new {@class="someClass"}) 

HtmlHelper automatycznie podnieść wartość domyślną, aby wyświetlić na DropDownList

simples!

Mam nadzieję, że może pomóc Tobie i wszystkim innym - takim jak ja! - które straciły dużo czasu szukając rozwiązania dla tego oczywistego problemu.

+1

Przykro mi, stary, zupełnie nie działa. –

Powiązane problemy