2010-01-18 6 views
0

La validation du modèle n'évalue pas les attributs liés aux valeurs de la zone de liste si vous n'en sélectionnez pas au moins une. De cette façon, il n'est pas possible d'effectuer une évaluation de modèle à l'aide de DataAnnotations afin d'informer les valeurs requises.Les valeurs null de listbox ne sont pas évaluées dans la liaison de modèle de ASP.NET-MVC

Le contrôleur:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using TestValidation.Models; 

namespace TestValidation.Controllers 
{ 
    [HandleError] 
    public class HomeController : Controller 
    { 
    private SelectList list = new SelectList(new List<string>() 
     { 
      "Sao Paulo", 
      "Toronto", 
      "New York", 
      "Vancouver" 
     }); 
    public ActionResult Index() 
    { 
     ViewData["ModelState"] = "NOT EVAL"; 
     ViewData["ItemsList"] = list; 
     return View(); 
    } 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(MyEntity entity) 
    { 
     if (ModelState.IsValid) 
     { 
     ViewData["ModelState"] = "VALID"; 
     } 
     else 
     { 
     ViewData["ModelState"] = "NOT VALID!!!"; 
     } 
     ViewData["ItemsList"] = list; 
     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 

    } 
} 

La vue:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<TestValidation.Models.MyEntity>" %> 

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
    Home Page 
</asp:Content> 
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2> 
    Validation Test</h2> 
    <p> 
    <% using (Html.BeginForm()) 
    {%> 
    <fieldset> 
    <p> 
     ModelState: 
     <%= Html.Encode((string)ViewData["ModelState"])%> 
    </p> 
    <p> 
     <label for="Name"> 
     Name:</label> 
     <%= Html.TextBoxFor(m => m.Name)%> 
     <%= Html.ValidationMessageFor(m => m.Name)%> 
    </p> 
    <p> 
     <label for="ItemFromList"> 
     Items (list):</label> 
     <%= Html.ListBoxFor(m => m.ItemFromList, ViewData["ItemsList"] as SelectList)%> 
     <%= Html.ValidationMessageFor(m => m.ItemFromList)%> 
    </p> 
    <p> 
     <label for="ItemFromCombo"> 
     Items (combo):</label> 
     <%= Html.DropDownListFor(m => m.ItemFromCombo, ViewData["ItemsList"] as SelectList)%> 
     <%= Html.ValidationMessageFor(m => m.ItemFromCombo)%> 
    </p> 
    <p> 
     <input type="submit" value="Submit" /> 
    </p> 
    </fieldset> 
    <% } %> 
</asp:Content> 

Le modèle:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 


namespace TestValidation.Models 
{ 
    public class MyEntity_Validate : ValidationAttribute 
    { 
    public MyEntity_Validate() 
    { 
     this.ErrorMessage = "Validated!. Is <> Toronto"; 
    } 
    public override bool IsValid(object value) 
    { 
     return ((string)value == "Toronto"); 
    } 
    } 
    public class MyEntity 
    { 
    [Required] 
    public string Name { get; set; } 
    [MyEntity_Validate] 
    public string ItemFromList { get; set; } 
    [MyEntity_Validate] 
    public string ItemFromCombo { get; set; } 
    } 
} 

Toute aide serait très apprécié. Je vous remercie.

Répondre

0

Le problème est connu, mais l'équipe de développement MVC ne prévoit pas actuellement de modifier la fonctionnalité (http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=4858).

blog post spmason: http://spmason.com/post/343293206/why-aspnetmvc-2-is-broken

Personnellement, je suis d'accord avec vous que la fonctionnalité est source de confusion. Si un champ est requis et non transmis, ModelState n'est pas valide.

+0

Bonne nouvelle! Scott Gu a déclaré: "L'équipe cherche à changer le comportement de la version finale d'ASP.NET MVC 2 pour valider toutes les propriétés par défaut". http://twitter.com/scottgu/statuses/8057127000 – smaglio81