代码之家  ›  专栏  ›  技术社区  ›  Webjedi

使用数据注释验证ASP.NET MVC 2中的SelectList

  •  5
  • Webjedi  · 技术社区  · 16 年前

    我尝试在选择列表中使用内置的ASP.NET MVC 2客户端验证,如下所示:

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

    但是,它不起作用…如果选择默认值0,则不会显示验证消息,页面将继续进行,如同已验证一样。思想?

    3 回复  |  直到 15 年前
        1
  •  6
  •   Scott Baker    15 年前

    好吧,所以我在一个稍微不同的问题的答案中找到了答案。所以我在这里发布了我的完整代码,它扩展到了Scott Guthries ASP.NET MVC 2验证帖子: http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

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

    我的颜色类别:

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

    我的列表助手扩展名是从Rob Connery那里偷来的,他是从别人那里偷来的:

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

    我的控制器代码(是的,可以重构为更干燥的代码):

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

    我的页面标记:

    <% 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>
    
    <% } %>
    
        2
  •  1
  •   James Fleming    16 年前

    当我使用ViewModel时,我会有一个属性categoryID,并将范围验证器放在上面,而不是下拉列表。selectlist只提供数据—您根据模型进行验证。

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

    在视图中,我的下拉列表中有我的类别的ID,但有我的类别列表:

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

    当您的数据发回服务器时,您应该注意到类包含id值。

        3
  •  0
  •   Community Mohan Dere    9 年前

    我不认为它与DataAnnotations有关,因为如果模型绑定到一个不可为空的实体,并且试图将一个无效值放入其中,那么在没有它们的情况下也会发生这种情况。我所做的是将modelstate[“XXXX”].value.attemptedValue从表单中发送,并根据该表单而不是实体中的属性进行验证。我想知道是否完全根据原始表单数据而不是仅仅根据问题项进行验证更合适。

    类似的答复: ASP.NET MVC: DataAnnotations - Show an error message indicating that a field must be numeric

    我也提出了类似的问题: ASP.NET MVC. Validation fails on dropdown no matter the value