2010-01-18 10 views
5

Estoy tratando de utilizar el construido en ASP.NET MVC 2 validación del lado del cliente en una lista de selección como el siguiente:SelectList en ASP.NET MVC 2 con anotaciones de datos

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; 
      } 
     } 

Sin embargo no es trabajando ... si se selecciona el valor predeterminado que es 0, el mensaje de validación no aparece y la página progresa como si estuviera validada. ¿Pensamientos?

+0

encontrado una respuesta del tipo: http://stackoverflow.com/questions/1047899/problems-with-asp-mvc-html-dropdownlist-using-a-modelview-pattern retoque leve y funciona ... mayor inconveniente es que tengo que volver a llenar el menú desplegable si el ModelState no es válido ... – Webjedi

+0

Le pregunté a pregunta relacionada con este http://stackoverflow.com/questions/2086999/null-values-from-listbox-are-not-evaluated-in-the-model-binding-of-asp-net-mvc – Jorge

Respuesta

6

Ok, así que encontré la respuesta en una respuesta a una pregunta ligeramente diferente. Así que les dejo mi código completo aquí, que se extiende sobre Scott Guthrie ASP.NET MVC 2 Validación mensaje: http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

Mi modelo de vista:

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; } 
} 

Mi clase Color:

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

Mi enumere las extensiones de ayuda robada de Rob Connery, quien se la robó a otra persona:

public static class ListExtensions 
{ 
    public static IEnumerable<T> ForEach<T>(this IEnumerable<T> collection, Action<T> action) 
    { 
     foreach (var item in collection) action(item); 
     return collection; 
    } 

    public static SelectList ToSelectList<T>(this IEnumerable<T> collection) 
    { 
     return new SelectList(collection, "Key", "Value"); 
    } 

    public static SelectList ToSelectList<T>(this IEnumerable<T> collection, string selectedValue) 
    { 
     return new SelectList(collection, "Key", "Value", selectedValue); 
    } 

    public static SelectList ToSelectList<T>(this IEnumerable<T> collection, 
         string dataValueField, string dataTextField) 
    { 
     return new SelectList(collection, dataValueField, dataTextField); 
    } 

    public static SelectList ToSelectList<T>(this IEnumerable<T> collection, 
         string dataValueField, string dataTextField, string selectedValue) 
    { 
     return new SelectList(collection, dataValueField, dataTextField, selectedValue); 
    } 
} 

Código Controlador Mi (sí que podría ser rediseñado para ser más SECO):

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); 
    } 

Mi página de marcado:

<% 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

No creo que tenga que ver con DataAnnotations porque pasa sin ellos también cuando tienes un modelo vinculado a una entidad con un sistema que no admite nulos y tratas de ponerle un valor no válido. Lo que he hecho es enviar junto con ModelState ["XXXX"]. Value.AttemptedValue del formulario y validarlo en lugar de la propiedad en la entidad. Me pregunto si es más apropiado validar completamente los datos del formulario en bruto en lugar de solo los elementos problemáticos.

Una respuesta similar: ASP.NET MVC: DataAnnotations - Show an error message indicating that a field must be numeric

también plantea una pregunta similar: ASP.NET MVC. Validation fails on dropdown no matter the value

1

Cuando trabajo con mi modelo de vista, tendría un CategoryId propiedad y puse mi validador rango en eso, no en el menú desplegable . La lista de selección solo proporciona los datos; usted los valida con el modelo.

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

En la vista que tendría mi desplegable con el id de mi categoría, pero la lista de mis Categorías:

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

cuando sus mensajes de datos de vuelta al servidor, se debe observar que la clase contiene el valor de id.

+1

W Cuando pruebo tu código, me dice que CategoryId es de tipo int, pero debe ser un IEnumerable . Así que lo cambié ... pero luego piensa que cada valor es una cadena. Hmmmm – Webjedi

Cuestiones relacionadas