2010-12-12 19 views
1

J'ai une page avec 2 formulaires dessus. L'un d'eux a une liste déroulante sur elle:Validation de la liste déroulante vide dans asp.net mvc

<form ...> 

<%: Html.DropDownListFor(x => Model.NewForm.FormId, Model.Forms)%> 

<%: Html.ValidationMessageFor(x => Model.NewForm.FormId, "*")%> 

<input type="submit" value="Add" /> 
</form> 

propriété NewForm du modèle est:

public class AddFormViewModel 
{ 
    [Required] 
    [DisplayName("Form Id:")] 
    public int? FormId { get; set; } 
} 

J'ai remarqué que lorsque la liste déroulante est vide, la « forme » L'argument est toujours nul et ModelState est toujours valide.

[HttpPost] 
public ActionResult AddForm([Bind(Prefix="NewForm")]AddFormViewModel form) 
{ 
    if (ModelState.IsValid) 
    { 
     ... save 
    } 
    else 
    { 
     ... show validation error 
    } 

    return ... 
} 

Lorsque la liste déroulante est pas vide, tout fonctionne comme prévu, « forme » n'est pas nul.

La valeur de la liste déroulante n'est pas envoyée lorsqu'elle est vide, c'est le comportement par défaut, mais de toute façon, comment faire fonctionner la validation?

Quelques idées:

1) Je peux ajouter une propriété à voir le modèle qui sera une entrée cachée à la page juste pour faire fonctionner le modèle de liaison;

2) modèle personnalisé liant

Quelles sont vos idées?

+0

Quand vous dites vide, vous voulez dire qu'il n'y a pas d'options dans la liste de sélection ou aucune option a été sélectionnée? – Paul

+0

Aucune option dans la liste de sélection. –

+0

Si vous ajoutez une valeur par défaut à la liste de sélection avec la valeur = "null" text = "Sélectionnez l'option" la null entraînera le ModelBinder par défaut pour effectuer la sélection requise. – Paul

Répondre

0

Que diriez-vous

[HttpPost] 
public ActionResult AddForm(AddFormViewModel form) 
{ 
    if (form!= null && ModelState.IsValid) 
    { 
     ... save 
    } 
    else 
    { 
     ... show validation error 
    } 

    return ... 
}