如何使用 DataAnnotation 验证下拉列表?
how to validate dropdownlist using the DataAnnotation?
我需要你的帮助,我在使用 AdataAnnotation 进行验证时遇到问题
我正在尝试使用它来验证下拉列表,但它存在一些问题
这是我的代码
View Side
@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" />
}
Controller Side
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);
}
}
The Data Holder
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; }
}
}
您的代码存在 2 个主要问题。
首先,您尝试将 <select>
绑定到 List<SelectListItem>
的 属性,但是 <select>
仅 post 返回单个值类型不能绑定到 List<SelectListItem>
所以 属性 是 null
并且验证失败。您的属性需要(例如)typeof int
或 string
.
其次,您手动添加 SelectListItem
与 Value ="0"
和 Text = "Choose ..."
这意味着即使您更正了第一个问题,如果用户选择了第一个选项("Choose ..."),您的模型将有效,因为“0”是有效值。
您的 class 需要
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!
}
请注意您的模型包含 List<SelectListItem>
的属性,因此不要使用 ViewBag
,并且在任何情况下,DropDownList()
方法只需要 IEnumerable<SelectListItem>
作为其第二个参数,因此从 List<SelectListItem>
创建一个新的 SelectList
只是不必要的额外开销
然后在视图中
@Html.LabelFor(m => m.ProjectOwner)
@Html.DropDownListFor(m => m.ProjectOwner, Model.ProjectOwnerList, "Choose...")
@Html.ValidationMessageFor(m => m.ProjectOwner)
请注意 DropDownListFor()
的第三个参数添加了一个 labelOption
和 null
值 - <option value>Choose...</option>
-,所以如果它被选中,你现在会得到一个错误消息和模型将无效。
假设用户选择"Second"
,那么当你post返回时,ProjectOwner
的值将是2
。
之前的答案是一个很好的答案,但它仍然有一个问题,当它无法验证其中一个字段时会出现问题,它会将您重定向到同一页面,现在您会遇到问题,因为在您的在这种情况下您没有启动任何新列表的代码,因此您将收到错误,因为对象中列表的值为空值。
你的代码可以这样修改来解决这个问题。
Add this to your code to organize it and you could add more than one GetList method depending on your needs.
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;
}
Modify the addNewProject method to be like this.
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);
}
}
请注意,如果使用 DataAnnotation Client Side Validation,您将不会注意到此问题,但即使您使用 Client Side Validation,也必须解决该问题
我需要你的帮助,我在使用 AdataAnnotation 进行验证时遇到问题
我正在尝试使用它来验证下拉列表,但它存在一些问题
这是我的代码
View Side
@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" />
}
Controller Side
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);
}
}
The Data Holder
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; }
}
}
您的代码存在 2 个主要问题。
首先,您尝试将 <select>
绑定到 List<SelectListItem>
的 属性,但是 <select>
仅 post 返回单个值类型不能绑定到 List<SelectListItem>
所以 属性 是 null
并且验证失败。您的属性需要(例如)typeof int
或 string
.
其次,您手动添加 SelectListItem
与 Value ="0"
和 Text = "Choose ..."
这意味着即使您更正了第一个问题,如果用户选择了第一个选项("Choose ..."),您的模型将有效,因为“0”是有效值。
您的 class 需要
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!
}
请注意您的模型包含 List<SelectListItem>
的属性,因此不要使用 ViewBag
,并且在任何情况下,DropDownList()
方法只需要 IEnumerable<SelectListItem>
作为其第二个参数,因此从 List<SelectListItem>
创建一个新的 SelectList
只是不必要的额外开销
然后在视图中
@Html.LabelFor(m => m.ProjectOwner)
@Html.DropDownListFor(m => m.ProjectOwner, Model.ProjectOwnerList, "Choose...")
@Html.ValidationMessageFor(m => m.ProjectOwner)
请注意 DropDownListFor()
的第三个参数添加了一个 labelOption
和 null
值 - <option value>Choose...</option>
-,所以如果它被选中,你现在会得到一个错误消息和模型将无效。
假设用户选择"Second"
,那么当你post返回时,ProjectOwner
的值将是2
。
之前的答案是一个很好的答案,但它仍然有一个问题,当它无法验证其中一个字段时会出现问题,它会将您重定向到同一页面,现在您会遇到问题,因为在您的在这种情况下您没有启动任何新列表的代码,因此您将收到错误,因为对象中列表的值为空值。
你的代码可以这样修改来解决这个问题。
Add this to your code to organize it and you could add more than one GetList method depending on your needs.
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;
}
Modify the addNewProject method to be like this.
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);
}
}
请注意,如果使用 DataAnnotation Client Side Validation,您将不会注意到此问题,但即使您使用 Client Side Validation,也必须解决该问题