gpt4 book ai didi

asp.net-mvc-4 - 如何使用 DataAnnotation 验证下拉列表?

转载 作者:行者123 更新时间:2023-12-04 06:22:16 25 4
gpt4 key购买 nike

我需要你的帮助,我在使用 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 个主要问题。

首先你尝试绑定(bind)一个 <select>到属性 List<SelectListItem> ,而是一个 <select>仅回发无法绑定(bind)到 List<SelectListItem> 的单个值类型所以属性是null并且验证失败。您的属性需要(例如)typeof intstring .

其次,您手动添加一个 SelectListItemValue ="0"Text = "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
}

然后在 Controller 中

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>作为它的第二个参数,所以创建一个新的 SelectList来自 List<SelectListItem>只是不必要的额外开销

然后在 View 中

@Html.LabelFor(m => m.ProjectOwner)
@Html.DropDownListFor(m => m.ProjectOwner, Model.ProjectOwnerList, "Choose...")
@Html.ValidationMessageFor(m => m.ProjectOwner)

注意 DropDownListFor() 的第三个参数添加 labelOptionnull值 - <option value>Choose...</option> -,所以如果它被选中,您现在将收到一条错误消息,并且该模型将无效。

假设用户选择 "Second" ,那么当你回发时,ProjectOwner 的值将是 2 .

关于asp.net-mvc-4 - 如何使用 DataAnnotation 验证下拉列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31099817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com