J'ai un formulaire avec une liste déroulante dans mon application MVC. Maintenant que j'essaie d'ajouter une validation au mélange, il semble qu'une liste déroulante échoue à la validation, quelle que soit sa valeur.ASP.NET MVC. La validation échoue sur la liste déroulante, peu importe la valeur
Sans la validation, cela permettra au contrôleur de fonctionner et de rediriger comme prévu. Avec la validation, il semble que les modifications de la base de données puissent avoir lieu, mais ModelState.IsValid est faux.
Je suis bloqué. est-ce un problème connu?
Vue:
<label for="parent">Child of:</label>
<%= Html.DropDownList("parent", (SelectList)ViewData["pageList"])%>
<%= Html.ValidationMessage("parent") %>
Action de contrôleur:
[AcceptVerbs(HttpVerbs.Post)]
[ValidateInput(false)]
[ValidateAntiForgeryToken()]
public ActionResult Create(Page page)
{
try
{
pageRepository.Insert(page);
}
catch (RuleException ex)
{
ex.CopyToModelState(ModelState);
}
if (!ModelState.IsValid)
{
var pageSelectList = pageRepository.GetTop().ToList();
pageSelectList.Add(new Page
{
menuTitle = "None"
});
ViewData["pageList"] = new SelectList(pageSelectList.OrderBy(x => x.listOrder), "ID", "menuTitle");
return View();
}
return RedirectToAction("List");
}
L'erreur renvoyée est: La valeur 'x' est pas valide. Où 'x' est la valeur numérique de la sélection en cours. L'échec se produit quelle que soit la valeur choisie.
public class Page
{
private EntityRef<Page> _parent = default(EntityRef<Page>);
private EntitySet<Page> _children = new EntitySet<Page>();
public int ID { get; set; }
public string pageTitle { get; set; }
public string menuTitle { get; set; }
public string content { get; set; }
public int listOrder { get; set; }
public bool visible { get; set; }
public int parent { get; set; }
public DateTime? created { get; set; }
public DateTime? edited { get; set; }
public string createdBy { get; set; }
public string lastEditBy { get; set; }
public string linkInfo { get; set; }
public bool IsSelected { get; set; }
public Page Parent
{
// return the current entity
get { return this._parent.Entity; }
set { this._parent.Entity = value; }
}
public EntitySet<Page> Children
{
get { return this._children; }
set { this._children.Assign(value); }
}
public static Page Error404()
{
return (new Page
{
content = "<p>Page not found</p>",
pageTitle = "404. Page not found"
});
}
}
Voici ce que j'ai essayé pour une solution de contournement:
public ActionResult Create([Bind(Exclude="parent")] Page page)
{
page.parent = Convert.ToInt32(Request.Form["parent"]);
...
Je viens exclure la dropdownlist du ModelBinding et rechargés en arrière via le Request.Form. Est-ce une bonne pratique?
Je devrais également mentionner que j'efface l'état du modèle: \t \t \t ModelState.Clair(); Ensuite, ajoutez les erreurs et les valeurs à nouveau en place: \t \t \t ModelState.AddModelError (champ, erreur); \t \t \t ModelState.SetModelValue (champ, ValueProvider [champ]); – mark123