Asp.net mvc 4 如何使用DataAnnotation验证dropdownlist?
我需要你的帮助,我在使用AdataAnnotation进行验证时遇到问题 我正在尝试使用它来验证下拉列表,但它有一些问题 这是我的密码 视图侧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
@使用(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);
}
}