Próbuję wypełnić listę rozwijaną z bazy danych zmapowanej za pomocą Linq-2-SQL, używając ASP.NET MVC 2 i nadal otrzymuję ten błąd.
Jestem tak zdezorientowany, ponieważ deklaruję zmienną typu IEnumerable<SelectListItem>
w drugim wierszu, ale błąd sprawia, że myślę, że tak nie jest. Wydaje mi się, że to powinno być bardzo proste, ale walczę. Każda pomoc jest mile widziana.
Oto interesujące fragmenty mojego kontrolera:
public ActionResult Create()
{
var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;
return View();
}
A oto interesujące fragmenty mojego poglądu:
<div class="editor-label">
<%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
<%: Html.DropDownList("basetype") %>
<%: Html.ValidationMessageFor(model => model.basetype) %>
</div>
Oto akcja POST podczas przesyłania formularza
// POST: /Meals/Create
[HttpPost]
public ActionResult Create(Meal meal)
{
if (ModelState.IsValid)
{
try
{
// TODO: Add insert logic here
var db = new DB();
db.Meals.InsertOnSubmit(meal);
db.SubmitChanges();
return RedirectToAction("Index");
}
catch
{
return View(meal);
}
}
else
{
return View(meal);
}
}
Dzięki.
asp.net-mvc
JBibbs
źródło
źródło
Odpowiedzi:
Miałem ten sam problem i wreszcie uzyskałem odpowiedź ...
Problem polega na tym, że w akcji POST, po przesłaniu formularza, ModelState jest nieprawidłowy lub wyłapuje błąd w try / catch, więc zwracany jest widok. Ale tym razem Widok nie jest
ViewData["basetype"]
poprawnie ustawiony.Musisz go ponownie wypełnić, prawdopodobnie tym samym kodem, co wcześniej, więc powtórz to:
przed
return View(meal)
w[HttpPost]
metodzie.dokładnie to rozwiąże twój problem:
Wiem, że to pytanie jest bardzo stare, ale przyjechałem tu dzisiaj z tym samym problemem, więc inni mogliby przyjść tu później ...
źródło
Ten błąd zostanie wyświetlony, jeśli SelectList ma wartość null.
źródło
ModelState.IsValid==false
zwrotnego do akcji POST (oczywiście), która ma, więc zwracasz model,return View(model)
ale nie wypełniasz ponownie źródła SelectList przed powrotem z POST. Ponieważ nie ma ViewState ala WebForms, nie ma źródła, z którego@Html.DropDown
pomocnik mógłby odbudować selekcję. Musisz wypełnić tę listę źródeł KAŻDY raz, gdy zwracasz widok do klienta, nie tylko na GET.Właśnie natknąłem się na ten problem i ten artykuł pomógł mi go rozwiązać - http://odetocode.com/Blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc. aspx
Najprawdopodobniej spowoduje to ponowne zapełnienie kolekcji po po
źródło
Dla przyszłych czytelników, jeśli używasz maszynki do golenia, spróbuj zmienić typ elementu listy wyboru z listy na IEnumerable.
Z
Do
źródło
Spróbuj dodać ciąg znaków dla nazwy listy rozwijanej jako pierwszy parametr i usuń element ze swoich viewdata:
Oto także metoda rozszerzenia, której możesz użyć, aby lista rozwijana była skonfigurowana w podobny sposób, jak w przypadku innych elementów sterujących:
Na przykład
źródło
Ustawiasz kolekcję jako element w słowniku ViewData i próbujesz pobrać ją jako właściwość w modelu. Prostą poprawką byłoby odwołanie się do niego w taki sam sposób, jak go ustawiłeś:
Alternatywnie, poniższy kod używa silnie wpisanego widoku:
Następnie w swoim silnie wpisanym widoku:
źródło
Jeśli używasz
Html.DropDownList()
metody - ten sam błąd może wystąpić, jeśli element ViewData / Viewbag nie jest ustawiony, jak odpowiedział @Peto.Ale może nie być ustawiony poprawnie w przypadku elementu zestawu kontrolera, ale w widoku głównym używasz częściowego wywołania viw z nowymi wartościami ViewDataDictionary.
jeśli masz
@Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ })
to częściowy widok nie będzie widziećViewData
iViewBag
danych, usuńnew ViewDataDictionary()
parametrźródło
Przyszłym czytelnikom,
Natknąłem się dzisiaj na problem i nie mogłem go naprawić. W końcu okazało się to naprawdę proste. Pracowałem ze stołem + widokiem. Kiedy zaktualizowałem tabelę (dodałem kilka kolumn), zapomniałem zaktualizować (upuścić i odtworzyć) widok, co spowodowało u mnie problem. Mam nadzieję, że to komuś pomoże.
źródło
Mam dzisiaj ten sam błąd i moim rozwiązaniem jest „poprawność” modelu.
W moim przypadku po przesłaniu przez użytkownika kliknięciem „zapisz” otrzymałem stan modelu: nieprawidłowy, jeśli użytkownik wprowadził „0”, ale stan modelu będzie ważny, jeśli użytkownik wprowadzi „0,0”.
Dlatego nadpisuję metodę „IsValid”, aby zwracała wartość true, nawet wpisaną przez użytkownika wartość „0”.
Mam nadzieję, że to pomoże.
źródło