comment valider dropdownlist à l'aide de la DataAnnotation?
J'ai besoin de votre aide, j'ai un problème avec la validation à l'aide de AdataAnnotation
Je suis en train de valider une liste déroulante à l'aide, mais il y a un problème avec elle
c'est mon code
Vue Latérale
@using (Html.BeginForm("addNewProject", "Activities", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationMessage("ProjectName")
<h3>Project Name: </h3>
@Html.TextBox("ProjectName", null, new { @class = "text_field"} )
@Html.ValidationMessage("ProjectOwner")
<h3>Project Owner: </h3>
@Html.DropDownList("ProjectOwner", (SelectList)ViewBag.Customers, new { @class = "text_field" })
@Html.ValidationMessage("Description")
<h3>Description: </h3>
@Html.TextArea("Description", new { @class = "text_area"})
@Html.ValidationMessage("Department")
<h3>Departments: </h3>
@Html.DropDownList("Department", (SelectList)ViewBag.Departments, new { @class = "list" })
@Html.ValidationMessage("Region")
<h3>Regions: </h3>
@Html.DropDownList("Region", (SelectList)ViewBag.Regions, new { @class = "list" })
<input type="submit" value="Add" class="submit" />
}
Contrôleur De Côté
public ActionResult NewProject()
{
List<SelectListItem> list = new List<SelectListItem>();
list.Add(new SelectListItem() { Value = "0", Text = "Choose ..." });
list.Add(new SelectListItem() { Value = "1", Text = "First" });
list.Add(new SelectListItem() { Value = "2", Text = "Second" });
list.Add(new SelectListItem() { Value = "3", Text = "Third" });
ViewBag.Departments = new SelectList(list, "Value", "Text");
ViewBag.Regions = new SelectList(list, "Value", "Text");
ViewBag.Customers = new SelectList(list, "Value", "Text");
return View();
}
public ActionResult addNewProject(Project newProject)
{
if (ModelState.IsValid)
{
return RedirectToAction("index", "Home");
}
else
{
return View("NewProject", newProject);
}
}
Les Données De Titulaire De
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
namespace workflow.DataHolders
{
public class Project : DataHolder
{
[Required(ErrorMessage = "This Field Is Required")]
[StringLength(200, MinimumLength = 3, ErrorMessage = "Length Of The Title Should Be More Than 3 Letters")]
public string ProjectName{ get; set; }
[Required(ErrorMessage = "This Field Is Required")]
public List<SelectListItem> ProjectOwner { get; set; }
string Description { get; set; }
[Required(ErrorMessage = "This Field Is Required")]
public List<SelectListItem> Department { get; set; }
[Required(ErrorMessage = "This Field Is Required")]
public List<SelectListItem> Region { get; set; }
}
}
Quoi de validation sont vos attend - toutes les options de rendu ont un
mais il me donne toujours de valeur non valide, je ne sais pas pourquoi
Bien sûr - parce que votre tryng de se lier à une propriété qui est
ok merci beaucoup
value
attribut de sorte qu'il ne pourrait jamais être invalide. Et tous les 3 dropdownlists tentent de se lier à des propriétés qui sont List<SelectListItem>
qui cant de travail - un <select>
élément se lie à un seul type de valeur, n'est pas une collection d'objets complexesmais il me donne toujours de valeur non valide, je ne sais pas pourquoi
Bien sûr - parce que votre tryng de se lier à une propriété qui est
List<SelectListItem>
- les propriétés doit être int Region
, int Department
etc. Je vais ajouter une réponse bientôt seront plus en détail de cette question et d'autres dans votre code.ok merci beaucoup
OriginalL'auteur Mohammad | 2015-06-28
Vous devez vous connecter pour publier un commentaire.
Il y a 2 problèmes principaux de code.
D'abord de votre tentative de lier un
<select>
à une propriété qui estList<SelectListItem>
, mais un<select>
seulement enregistre un seul type de valeur qui ne peut pas être lié àList<SelectListItem>
donc la propriété estnull
et la validation échoue. Vos propriétés doivent être (par exemple) typeofint
oustring
.Deuxièmement, votre ajout manuel d'un
SelectListItem
avecValue ="0"
etText = "Choose ..."
ce qui signifie que même si vous corrigez la première question, si l'utilisateur sélectionne la première option ("Choisir ..."), votre modèle sera valide parce que "0" est une valeur valide.Votre classe doit être
Puis dans le contrôleur
Note votre modèle contient les propriétés de
List<SelectListItem>
donc ne l'utilisez pasViewBag
, et dans tous les cas, laDropDownList()
méthode ne nécessiteIEnumerable<SelectListItem>
comme second paramètre, donc la création d'une nouvelleSelectList
deList<SelectListItem>
est juste inutile supplémentairePuis dans la vue
Noter que le 3e paramètre de
DropDownListFor()
ajoute unlabelOption
avec unnull
valeur<option value>Choose...</option>
-, donc si certains de ses, youu obtiendrez alors un message d'erreur et le modèle ne sera pas valide.En supposant que l'utilisateur sélectionne
"Second"
, puis lorsque vous postez en arrière, la valeur deProjectOwner
sera2
.J'ai ajouté un nouveau modifié en réponse à votre réponse.
OriginalL'auteur
La réponse précédente est une très bonne réponse, mais encore il a un problème, le problème apparaît lorsque l'on ne parvient pas à valider l'un des champs, il va vous rediriger vers la même page, et maintenant vous avez un problème parce que, dans votre code, vous n'avez pas initié toute nouvelle liste de cas de sorte que vous obtiendrez une Erreur parce que les valeurs de la liste dans l'objet sont les valeurs null.
votre code pourrait être modifiée de ce genre pour résoudre ce problème.
Notez que vous ne verrez pas ce problème si vous utilisez le DataAnnotation la Validation Côté Client, mais même si vous utilisez la validation Côté Client que vous avez à résoudre ce problème
list.Add(new SelectListItem() { Value = "", Text = "Choose ..." });
et de le faire correctement en utilisant la surcharge deDropDownListFor()
qui accepte unoptionLabel
- voir ma réponseEt l'approche la plus répandue consiste à utiliser un
private void ConfigureViewModel(Project model) { // populate select lists and other common stuff }
de sorte que vous besoin d'une seule ligne de code dans les méthodes GET et POSTJe pense que même lorsque vous utilisez la surcharge DropDownListFor() avec le lancement d'une nouvelle liste pour chaque liste dans l'objet, vous obtiendrez ce message d'erreur "la référence d'Objet n'est pas définie à une instance d'un objet", parce que même dans la méthode surchargée vous êtes à l'aide de l'objet "Modèle.ProjectOwnerList".
Bien sûr, vous devez initialiser la
SelectList
. Mon commentaire était que la bonne façon de générer le "Veuillez choisir.." option est d'utiliser la surcharge 🙂merci à Tous 🙂 🙂
OriginalL'auteur Mohammad