J'essaie de remplir une liste déroulante à partir d'une base de données mappée avec Linq-2-SQL, en utilisant ASP.NET MVC 2, et continue à obtenir cette erreur.
Je suis tellement confus parce que je déclare une variable de type IEnumerable<SelectListItem>
sur la deuxième ligne, mais l'erreur me fait penser que ce n'est pas le cas. Je pense que cela devrait être très simple, mais je me bats. Toute aide est appréciée.
Voici les éléments intéressants de mon contrôleur:
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();
}
Et voici les éléments intéressants de mon point de vue:
<div class="editor-label">
<%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
<%: Html.DropDownList("basetype") %>
<%: Html.ValidationMessageFor(model => model.basetype) %>
</div>
Voici l'action POST lors de la soumission du formulaire
// 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);
}
}
Merci.
asp.net-mvc
JBibbs
la source
la source
Réponses:
J'ai eu le même problème, et finalement j'ai eu la réponse ...
Le problème est que dans l'action POST, après avoir soumis le formulaire, le ModelState n'est pas valide ou il détecte une erreur dans try / catch, de sorte que la vue est renvoyée. Mais cette fois, la vue n'a pas été
ViewData["basetype"]
correctement définie.Vous devez le remplir à nouveau, probablement avec le même code utilisé auparavant, alors répétez ceci:
avant le
return View(meal)
dans la[HttpPost]
méthode.exactement cela résoudra votre problème:
Je sais que cette question est très ancienne, mais je suis venu ici aujourd'hui avec le même problème, donc d'autres pourraient venir ici plus tard ...
la source
Vous recevrez cette erreur si la SelectList est nulle.
la source
ModelState.IsValid==false
donc vous renvoyez le modèlereturn View(model)
mais ne remplissez pas votre source SelectList avant de revenir du POST. Comme il n'y a pas de ViewState ala WebForms, il n'y a pas de source avec laquelle l'@Html.DropDown
assistant peut reconstruire la sélection. Vous devez remplir cette liste source CHAQUE fois que vous renvoyez la vue au client et pas seulement sur le GET.Je viens de rencontrer ce problème et cet article m'a aidé à le traverser - http://odetocode.com/Blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc. aspx
La cause la plus probable est que votre collection est repeuplée après la po
la source
Pour les futurs lecteurs, si vous utilisez Razor, essayez de changer le type d'élément de la liste de sélection de List à IEnumerable.
De
À
la source
Essayez d'ajouter une chaîne pour le nom de votre liste déroulante en tant que premier paramètre et retirez l'élément de vos données d'affichage:
Voici également une méthode d'extension que vous pouvez utiliser pour que la liste déroulante soit configurée dans un style similaire à la façon dont vous avez effectué vos autres contrôles:
Par exemple
la source
Vous définissez la collection en tant qu'élément dans le dictionnaire ViewData et essayez de la récupérer en tant que propriété sur le modèle. Une solution simple serait de le référencer de la même manière que vous le définissez:
Alternativement, le code ci-dessous utilise une vue fortement typée:
Ensuite, dans votre vue fortement typée:
la source
Si vous utilisez la
Html.DropDownList()
méthode - la même erreur peut se produire si votre élément ViewData / Viewbag n'est pas défini, comme @Peto a répondu.Mais il peut ne pas être défini correctement dans le cas d'un élément de jeu de contrôleur, mais dans la vue principale, vous utilisez un appel viw partiel avec de nouvelles valeurs ViewDataDictionary.
si vous avez
@Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ })
alors votre vue partielle ne verra pasViewData
et lesViewBag
données, supprimez lenew ViewDataDictionary()
paramètrela source
Aux futurs lecteurs,
Je suis tombé sur le problème aujourd'hui et je n'ai pas pu le résoudre. Cela s'est avéré très simple après tout. Je travaillais avec une table + vue. Lorsque j'ai mis à jour le tableau (ajouté quelques colonnes), j'ai oublié de mettre à jour (supprimer et recréer) la vue, ce qui a causé le problème pour moi. J'espère que ça aide quelqu'un.
la source
J'ai eu la même erreur aujourd'hui et ma solution est de rendre le modèle "valide".
Dans mon cas, après que l'utilisateur a soumis en cliquant sur "enregistrer", j'ai obtenu l'état du modèle: invalide si l'entrée au clavier de l'utilisateur "0", mais l'état du modèle sera valide si la clé de l'utilisateur est "0.0".
Donc, je remplace la méthode "IsValid" pour renvoyer true même l'entrée au clavier "0".
J'espère que ça aide.
la source