2010-01-18 11 views
5

Ich versuche, die eingebaut in ASP.NET MVC 2 Client-seitige Validierung auf einer Auswahlliste wie folgt zu verwenden:Validieren einen Select in ASP.NET MVC 2 mit Data Annotations

private SelectList _CategoryList; 
     [Required(ErrorMessage = "Category Required")] 
     [System.ComponentModel.DataAnnotations.Range(1, double.MaxValue, ErrorMessage = "Please Select A Category")] 
     [DisplayName("Category")] 
     public SelectList CategoryList 
     { 
      get 
      { 
       return new SelectList(Categories, "CatID", "CatFullName"); ; 
      } 
      set 
      { 
       _CategoryList = value; 
      } 
     } 

aber es nicht ist funktioniert ... Wenn der Standardwert 0 ausgewählt ist, wird die Validierungsnachricht nicht angezeigt und die Seite wird so weiter verarbeitet, als wäre sie validiert. Gedanken?

+0

Gefunden eine Antwort von Sorten: http://stackoverflow.com/questions/1047899/probleme-mit-asp-mvc-html-dropdownlist-using-a-modelview-pattern leichte Optimierung und es funktioniert ... größte Nachteil ist, ich muss die Dropdown-Liste neu auffüllen, wenn der ModelState ungültig ist ... – Webjedi

+0

Ich fragte ein Frage dazu http://stackoverflow.com/questions/2086999/null-values-from-listbox-are-not-evaluated-in-the-model-binding-of-asp-net-mvc – Jorge

Antwort

6

Ok, also fand ich die Antwort in einer Antwort auf eine etwas andere Frage. Also ich bin Entsendung meinen kompletten Code hier, die auf Scott Guthries ASP.NET MVC 2 Validierungs Post erweitert: http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

Mein Viewmodel:

public class Person 
{ 
    [Required(ErrorMessage="First Name Required")] 
    [StringLength(50,ErrorMessage="Must be under 50 characters")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage="Last Name Required")] 
    [StringLength(50, ErrorMessage = "Must be under 50 characters")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage="Age Required")] 
    [Range(1,120,ErrorMessage="Age Must be between 0 and 120")] 
    public int Age { get; set; } 

    [Required(ErrorMessage="Email Required")] 
    public string Email { get; set; } 


    public IEnumerable<SelectListItem> FavoriteColor { get; set; } 


    [Range(0, 6, ErrorMessage = "Out of range")] 
    public int SelectedFavColor { get; set; } 
} 

My Color-Klasse:

public class Colors 
{ 
    public int ColorID { get; set; } 
    public string ColorName { get; set; } 
} 

Mein Liste Helfer Erweiterungen von Rob Connery gestohlen, die es von jemand anderem gestohlen hat:

Mein Controller-Code (ja es könnte Refactoring sein DRY):

public ActionResult Create() 
    { 
     Person newFriend = new Person(); 
     IList<Colors> colorslist = new List<Colors>(); 
     colorslist.Add(new Colors { ColorID = -1, ColorName = "Please Select Color" }); 
     colorslist.Add(new Colors { ColorID = 1, ColorName = "Red" }); 
     colorslist.Add(new Colors { ColorID = 2, ColorName = "Green" }); 
     colorslist.Add(new Colors { ColorID = 3, ColorName = "Blue" }); 

     newFriend.FavoriteColor = colorslist.ToSelectList("ColorID","ColorName","-1"); 
     return View(newFriend); 
    } 

    [HttpPost] 
    public ActionResult Create(Person friendToCreate, FormCollection collection) 
    { 
     friendToCreate.SelectedFavColor = Convert.ToInt32(collection["SelectedFavColor"]); 
     if (ModelState.IsValid) 
     { 
      return Redirect("/"); 
     } 
     IList<Colors> colorslist = new List<Colors>(); 
     colorslist.Add(new Colors { ColorID = -1, ColorName = "Please Select Color" }); 
     colorslist.Add(new Colors { ColorID = 1, ColorName = "Red" }); 
     colorslist.Add(new Colors { ColorID = 2, ColorName = "Green" }); 
     colorslist.Add(new Colors { ColorID = 3, ColorName = "Blue" }); 
     friendToCreate.FavoriteColor = colorslist.ToSelectList("ColorID", "ColorName"); 
     return View(friendToCreate); 
    } 

Meine Seite Markup:

<% using (Html.BeginForm()) {%> 

    <fieldset> 
     <legend>Fields</legend> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.FirstName) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.FirstName) %> 
      <%= Html.ValidationMessageFor(model => model.FirstName) %> 
     </div> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.LastName) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.LastName) %> 
      <%= Html.ValidationMessageFor(model => model.LastName) %> 
     </div> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.Age) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.Age) %> 
      <%= Html.ValidationMessageFor(model => model.Age) %> 
     </div> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.Email) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.Email) %> 
      <%= Html.ValidationMessageFor(model => model.Email) %> 
     </div> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.FavoriteColor) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.DropDownList("SelectedFavColor", Model.FavoriteColor, -1)%> 
      <%= Html.ValidationMessageFor(model => model.SelectedFavColor) %> 
     </div> 

     <p> 
      <input type="submit" value="Submit" /> 
     </p> 
    </fieldset> 

<% } %> 
0

Ich denke nicht, dass es mit DataAnnotations zu tun hat, weil es auch ohne sie passiert, wenn Sie ein Modell an eine Entität mit einem Nullwert gebunden haben und versuchen, einen ungültigen Wert einzugeben. Was ich getan habe ist, ModelState ["XXXX"]. Value.AttemptedValue aus dem Formular zu senden und diese anstelle der Eigenschaft in der Entität zu validieren. Ich frage mich, ob es sinnvoller ist, die Rohformdaten vollständig zu validieren, statt nur die Problemelemente.

Eine ähnliche Antwort: ASP.NET MVC: DataAnnotations - Show an error message indicating that a field must be numeric

Ich stellte auch eine ähnliche Frage: ASP.NET MVC. Validation fails on dropdown no matter the value

1

Als ich mit meinem Viewmodel arbeiten, würde ich eine Eigenschaft CategoryId haben und mein Bereich Validator auf das setzen, nicht die Dropdown . Die Auswahlliste stellt nur die Daten bereit, die Sie anhand des Modells validieren.

[Required(ErrorMessage = "Category Required")] 
    [System.ComponentModel.DataAnnotations.Range(1, double.MaxValue, ErrorMessage = "Please Select A Category")] 
    [DisplayName("Category")] 
    public int CategoryId {get;set;} 

Auf der Ansicht, die ich meine Dropdown-Fenster mit der ID für meine Kategorie von meinen Kategorien aber die Liste haben würde:

<%= Html.DropDownList("CategoryId", (SelectList)Model.Categories, "(Select)")%>  

wenn Ihre Daten Stellungen auf den Server zurück, sollten Sie beachten, dass die Die Klasse enthält den ID-Wert.

+1

W Wenn ich den Code ausprobiere, teilt er mir mit, dass CategoryId vom Typ int ist, aber es muss ein IEnumerable sein. Also habe ich es geändert ... aber dann denkt es, dass jeder Wert eine Zeichenkette ist. Hmmmm – Webjedi

Verwandte Themen