2009-12-30 6 views
0

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?

Répondre

0

J'ai fini par tester ModelState ["parent"]. Value.AttemptedValue au lieu de la propriété d'entité qui était nulle lors de la tentative de mettre une chaîne dans un int ?.

+0

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

0

Qu'est-ce qui lance la RuleException? Je suppose que vous utilisez une sorte de moteur de validation pour déterminer si la propriété "parent" est valide ou non. Je passerais à travers pour voir pourquoi cette exception est lancée. Peut-être que la valeur ne passe pas dans votre action de contrôleur correctement ou peut-être vos règles de validation sont différentes de ce que vous pensez qu'ils sont.

+0

C'est tout. Je ne testais pas du tout pour les parents. C'est un champ lié dans le modèle mais il n'y avait pas de test pour déterminer sa validité. Je pense que puisqu'il est défini comme un int dans le DomainModel et la valeur d'une liste déroulante est toujours une chaîne qui peut être la raison pour laquelle la validation a échoué automatiquement lors de la liaison. – mark123

+0

Si c'est le cas, comment lier un DropDownList à un int? – mark123

+0

Vous devez coller votre classe Page afin que nous puissions le voir. Le fait qu'il lance une "RuleException" m'indique que vous utilisez un moteur de validation qui lancera ceci lorsque vous tenterez d'enregistrer un objet Page invalide dans la base de données. Dans ce cas, vous devez déterminer quelle règle est en infraction. Peut-être y a-t-il une valeur min/max? –

Questions connexes