Mam następujący model widoku
public class ProjectVM
{
....
[Display(Name = "Category")]
[Required(ErrorMessage = "Please select a category")]
public int CategoryID { get; set; }
public IEnumerable<SelectListItem> CategoryList { get; set; }
....
}
i następującą metodę kontrolera, aby utworzyć nowy projekt i przypisać plik Category
public ActionResult Create()
{
ProjectVM model = new ProjectVM
{
CategoryList = new SelectList(db.Categories, "ID", "Name")
}
return View(model);
}
public ActionResult Create(ProjectVM model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Save and redirect
}
i w widoku
@model ProjectVM
....
@using (Html.BeginForm())
{
....
@Html.LabelFor(m => m.CategoryID)
@Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "-Please select-")
@Html.ValidationMessageFor(m => m.CategoryID)
....
<input type="submit" value="Create" />
}
Widok wyświetla się poprawnie, ale podczas przesyłania formularza pojawia się następujący komunikat o błędzie
InvalidOperationException: Element ViewData, który ma klucz „CategoryID”, jest typu „System.Int32”, ale musi być typu „IEnumerable <SelectListItem>”.
Ten sam błąd występuje przy użyciu @Html.DropDownList()
metody i jeśli przekażę SelectList za pomocą ViewBag
lub ViewData
.
według Stephens (user3559349) odpowiedzi , to może być użyteczne:
lub w ProjectVM:
źródło
Najprawdopodobniej spowodowało jakiś błąd podczas przekierowywania na twoją stronę i nie inicjalizowałeś ponownie rozwijanych list modelu.
Upewnij się, że zainicjowałeś swoje listy rozwijane w konstruktorze modelu lub za każdym razem przed wysłaniem tego modelu na stronę.
W przeciwnym razie będziesz musiał utrzymywać stan list rozwijanych za pomocą worka widoku lub pomocników ukrytych wartości.
źródło
Miałem ten sam problem, otrzymywałem nieprawidłowy ModelState, kiedy próbowałem wysłać formularz. Dla mnie było to spowodowane ustawieniem CategoryId na int, kiedy zmieniłem go na ciąg, modelState był prawidłowy, a metoda Create działała zgodnie z oczekiwaniami.
źródło
OK, gotowa odpowiedź nadawcy dokładnie wyjaśniła, dlaczego wystąpił błąd, ale nie wyjaśniła , jak go uruchomić. Nie jestem pewien, czy to naprawdę odpowiedź, ale wskazało mi to właściwy kierunek.
Napotkałem ten sam problem i znalazłem sprytny sposób, aby go rozwiązać. Spróbuję to tutaj uchwycić. Zastrzeżenie - pracuję nad stronami internetowymi mniej więcej raz w roku i naprawdę nie wiem, co robię przez większość czasu. Tej odpowiedzi nie należy w żaden sposób uważać za odpowiedź „eksperta”, ale spełnia ona swoje zadanie przy niewielkim nakładzie pracy ...
Biorąc pod uwagę, że mam obiekt danych (najprawdopodobniej obiekt transferu danych), którego chcę użyć listy rozwijanej, aby podać prawidłowe wartości dla pola, na przykład:
Wtedy ViewModel wygląda następująco:
Prawdziwym problemem tutaj, tak elokwentnie opisanym powyżej @Stephen, jest to, że lista wyboru nie jest wypełniana w metodzie POST w kontrolerze. Więc twoje metody kontrolera wyglądałyby tak:
Masz to. To NIE działa kod, kopiowałem / wklejałem i edytowałem, aby było to proste, ale masz pomysł. Jeśli elementy członkowskie danych zarówno w oryginalnym modelu danych, jak i w wyprowadzonym modelu widoku mają tę samą nazwę, funkcja UpdateModel () wykonuje niesamowitą robotę, wypełniając tylko odpowiednie dane z wartości FormCollection.
Publikuję to tutaj, aby móc znaleźć odpowiedź, gdy nieuchronnie ponownie napotkam ten problem - mam nadzieję, że pomoże to również komuś innemu.
źródło
W moim przypadku pierwszy identyfikator na mojej liście był zerowy, kiedy zmieniłem identyfikator na 1, zadziałało.
źródło