如何使用DataAnnotation验证dropdownlist?

Moh*_*mad 2 data-annotations asp.net-mvc-4

我需要你的帮助,我在使用AdataAnnotation进行验证时遇到问题

我正在尝试使用它验证下拉列表,但它有一些问题

这是我的代码

查看侧面

        @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" />
        }
Run Code Online (Sandbox Code Playgroud)

控制器侧

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

数据持有者

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


    }
}
Run Code Online (Sandbox Code Playgroud)

小智 9

您的代码有两个主要问题.

首先你试图将一个<select>属性绑定到一个属性List<SelectListItem>,但是<select>只返回一个不能绑定的单个值类型,List<SelectListItem>因此属性null和验证失败.您的属性需要(例如)typeof intstring.

其次,您手动添加SelectListItemValue ="0"Text = "Choose ..."这意味着,即使你纠正第一个问题,如果用户选择第一个选项("选择..."),你的模式将是有效的,因为"0"是一个有效的值.

你的课需要

public class Project : DataHolder
{
  ....

  [Display(Name = "Project Owner")]
  [Required(ErrorMessage = "Please select a project owner")]
  public int ProjectOwner { get; set; }

  public List<SelectListItem> ProjectOwnerList { get; set; }

  .... // ditto for Department and Region
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器中

public ActionResult NewProject()
{
  List<SelectListItem> list = new List<SelectListItem>();
  list.Add(new SelectListItem() { Value = "1", Text = "First" });
  list.Add(new SelectListItem() { Value = "2", Text = "Second" });
  list.Add(new SelectListItem() { Value = "3", Text = "Third" });
  // Initialize the model
  Project model = new Project();
  model.ProjectOwnerList = list;
  model.DepartmentList = list;
  model.RegionList = list;
  return View(model); // always return a model even if its just a default new instance!
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的模型包含List<SelectListItem>不使用的属性ViewBag,并且在任何情况下,该DropDownList()方法仅需要IEnumerable<SelectListItem>作为其第二个参数,因此创建新的SelectListfrom List<SelectListItem>只是不必要的额外开销

然后在视图中

@Html.LabelFor(m => m.ProjectOwner)
@Html.DropDownListFor(m => m.ProjectOwner, Model.ProjectOwnerList, "Choose...")
@Html.ValidationMessageFor(m => m.ProjectOwner)
Run Code Online (Sandbox Code Playgroud)

请注意,第3个参数DropDownListFor()添加了labelOption一个null值 - <option value>Choose...</option>- 所以如果选中它,youu现在将收到一条错误消息,模型将无效.

假设用户选择"Second",那么当您回发时,其值ProjectOwner将为2.