Asp.net mvc 4 如何使用DataAnnotation验证dropdownlist?

Asp.net mvc 4 如何使用DataAnnotation验证dropdownlist?,asp.net-mvc-4,data-annotations,Asp.net Mvc 4,Data Annotations,我需要你的帮助,我在使用AdataAnnotation进行验证时遇到问题 我正在尝试使用它来验证下拉列表,但它有一些问题 这是我的密码 视图侧 @使用(Html.BeginForm(“addNewProject”,“Activities”,FormMethod.Post)) { @Html.AntiForgeryToken() @Html.ValidationMessage(“项目名称”) 项目名称: @TextBox(“ProjectName”,null,新的{@class=“text\u f

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

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

这是我的密码

视图侧

@使用(Html.BeginForm(“addNewProject”,“Activities”,FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationMessage(“项目名称”)
项目名称:
@TextBox(“ProjectName”,null,新的{@class=“text\u field”})
@Html.ValidationMessage(“项目所有者”)
项目业主:
@DropDownList(“ProjectOwner”,(SelectList)ViewBag.Customers,新的{@class=“text_field”})
@Html.ValidationMessage(“说明”)
说明:
@TextArea(“Description”,new{@class=“text\u area”})
@Html.ValidationMessage(“部门”)
部门:
@DropDownList(“Department”,(SelectList)ViewBag.Departments,new{@class=“list”})
@Html.ValidationMessage(“区域”)
区域:
@DropDownList(“Region”,(SelectList)ViewBag.Regions,新的{@class=“list”})
}
控制器端

public ActionResult NewProject()
{
列表=新列表();
添加(新建SelectListItem(){Value=“0”,Text=“Choose…”);
添加(新的SelectListItem(){Value=“1”,Text=“First”});
添加(新的SelectListItem(){Value=“2”,Text=“Second”});
添加(新的SelectListItem(){Value=“3”,Text=“Third”});
ViewBag.Departments=新选择列表(列表,“值”、“文本”);
ViewBag.Regions=新选择列表(列表,“值”、“文本”);
ViewBag.Customers=新选择列表(列表,“值”、“文本”);
返回视图();
}
公共行动结果addNewProject(Project newProject)
{
if(ModelState.IsValid)
{
返回重定向到操作(“索引”、“主页”);
}
其他的
{
返回视图(“NewProject”,NewProject);
}
}
资料持有人

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.Mvc;
使用System.ComponentModel.DataAnnotations;
命名空间工作流.DataHolders
{
公共类项目:数据持有者
{
[必需(ErrorMessage=“此字段是必需的”)]
[StringLength(200,MinimumLength=3,ErrorMessage=“标题长度应超过3个字母”)]
公共字符串ProjectName{get;set;}
[必需(ErrorMessage=“此字段是必需的”)]
公共列表项目所有者{get;set;}
字符串说明{get;set;}
[必需(ErrorMessage=“此字段是必需的”)]
公共列表部门{get;set;}
[必需(ErrorMessage=“此字段是必需的”)]
公共列表区域{get;set;}
}
}

您的代码有两个主要问题

首先,尝试将
绑定到
列表
的属性,但
只回发一个无法绑定到
列表
的值类型,因此属性为
null
,验证失败。您的属性需要是(例如)类型为
int
string

其次,您可以使用
Value=“0”
Text=“Choose…”
手动添加
SelectListItem
,这意味着即使您更正了第一个问题,如果用户选择第一个选项(“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
}
请注意,
DropDownListFor()
的第三个参数添加了一个带有
null
值的
labelOption
Choose…
-,因此如果选中该参数,您现在将收到一条错误消息,并且模型将无效


假设用户选择了
“Second”
,那么当您发回时,
ProjectOwner
的值将是
2

前面的答案是一个很好的答案,但仍然有一个问题,当它无法验证其中一个字段时,就会出现问题,它会将您重定向到同一页,现在您将遇到问题,因为在代码中,您没有在这种情况下启动任何新列表,因此您将得到错误,因为对象中列表的值为空

您的代码可以这样修改以解决此问题

将它添加到代码中以组织它,您可以根据需要添加多个GetList方法


请注意,如果使用DataAnnotation客户端验证,您不会注意到此问题,但即使使用客户端验证,您也必须解决此问题

您期望的验证是什么-您呈现的所有选项都有一个
属性,因此它永远不会无效。所有3个dropdownlists都试图绑定到无法工作的
列表
属性-一个
元素只绑定到一个值类型,而不是复杂对象的集合,但它总是给我无效值,我不知道为什么-因为您试图绑定到
列表
的属性-属性需要是
内部区域
内部部门
等。我将很快添加一个答案,并在您的代码中详细介绍此问题和其他问题。非常感谢,回答得很好。我在你的答案中添加了一个新的修改答案。删除
列表。添加(new SelectListItem(){Value=”“,Text=“Choose…”)并通过使用重载的
DropDownListFor()
正确执行,该重载接受
optionLabel
-请参见我的回答,常用的方法是使用
私有void ConfigureViewModel(项目模型){//填充选择列表和其他常用内容}
因此,在GET和POST方法中,您只需要一行代码
    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);
        }
    }
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; }


    }
}
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
}
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!
}
@Html.LabelFor(m => m.ProjectOwner)
@Html.DropDownListFor(m => m.ProjectOwner, Model.ProjectOwnerList, "Choose...")
@Html.ValidationMessageFor(m => m.ProjectOwner)
List<SelectListItem> GetList()
{
    List<SelectListItem> list = new List<SelectListItem>();

    list.Add(new SelectListItem() { Value = "", 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" });

    return list;
}
public ActionResult addNewProject(Project newProject)
{
    if (ModelState.IsValid)
    {

        return RedirectToAction("index", "Home");
    }
    else
    {

        newProject.ProjectOwnerList = GetList();
        newProject.DepartmentList = GetList();
        newProject.RegionList = GetList();

        return View("NewProject", newProject);
    }
}