【问题标题】:How To Validate DropDown List in Asp .net MVC如何在 Asp .net MVC 中验证下拉列表
【发布时间】:2015-08-08 15:56:59
【问题描述】:

本月列表已添加到数据库中。对于添加工资(创建操作),我必须从下拉列表中选择月份类型,如果未选择月份,则程序不应重定向以创建操作。如何在路由创建操作之前验证下拉列表?

@using(Html.BeginForm("Create","Talab",FormMethod.Post))
{ 
    <div class="row">
        <div class="form-group">
            <div class="col-md-2">
                <a href="@Url.Action("Create","TotalSalary")" class="btn btn-success input-sm">Add New </a>
            </div>
        </div>
        <div class="form-group">   
            <div class="col-md-2">
                @Html.DropDownListFor(model => model.Month.id,     (IEnumerable<SelectListItem>)ViewData["monthType"], "--Select a Month--")
                @Html.ValidationMessageFor(model => model.Month.id)
            </div>
        </div>
    </div>
}

我的视图模型有以下属性

public class Salary
{
   public int id { get; set; }
   public Nullable<int> month_id { get; set; }

   [Required]
   public virtual Month Month { get; set; }

   public IEnumerable<Month> GetMonths()
   {
        IEnumerable<Month> mat = null;
        mat = this.db.Months.ToList();
        return mat;
   }

}
Public Class Month
{
    public int id { get; set; }
    public string month { get; set; }
    public virtual ICollection<Salary> Salary { get; set; }
}

我的控制器动作索引

public ActionResult Index()
    {
        Salary salary = new Salary();
        ViewData["monthType"] = salary .GetMonths().ToList().Select(
                 s => new SelectListItem
                 {
                     Text = s.month,
                     Value = s.id.ToString()
                 });

        return View(salary);
    }

【问题讨论】:

  • 顺便说一句,强烈建议您干净地格式化您的代码,以便人们可以快速准确地了解您在做什么!
  • 只需像任何其他输入一样使用RequiredAttribute。验证与下拉列表或文本框或您使用的任何输入无关。
  • 不 它没有工作!我可以在不从下拉列表中选择任何值的情况下重定向到创建操作。
  • 如果我理解正确,如果下拉列表中未设置月份,您是否希望禁用创建链接?然后你必须使用 javascript 进行验证。
  • 是的!正是......请帮助解决这个问题

标签: asp.net-mvc validation


【解决方案1】:

您的下拉列表应该绑定到属性month_id,即Nullable&lt;int&gt;,但您没有使用[Required] 属性对其进行修饰。应该是

[Required(ErrorMessage="Please select a month")]
public Nullable<int> month_id { get; set; } 

在视图中

@Html.DropDownListFor(m => m.month_id, ....)
@Html.ValidationMessageFor(m => m.month_id)

旁注:您声称您使用的是视图模型,但实际上您没有。您展示的是一个数据模型。视图模型仅包含与您的视图相关的属性,并且永远不应包含访问您的数据库的方法。参考What is ViewModel in MVC?

在您的情况下,视图模型将是

public class SalaryViewModel
{
  public int id { get; set; }
  [Required(ErrorMessage="Please select a month")]
  [Display(Name = "Month")] // for use in @Html.LabelFor()
  public Nullable<int> month_id { get; set; }
  public SelectList MonthList { get; set; } // or IEnumerable<SelectListItem> MonthList
}

在控制器中填充 MonthList 属性并在视图中将其用作

@Html.DropDownListFor(m => m.month_id, Model.MonthList, "--Select a Month--")

【讨论】:

  • 控制器应该添加什么?
  • 您的意思是填充SelectList 吗?如果是这样,它正是您当前用来分配ViewData["monthType"]
  • 你的解决方案不会给出我的答案!!不过谢谢
  • 什么意思不会给你答案。阅读第一段。您绑定到一个名为 month_id 的属性,该属性可以为空,但您没有所需的属性,因此您选择的任何内容(包括“--Select a Month--”选项)都是有效的。这是正确的答案!附注只是指出你应该如何做。
  • @Html.DropDownListFor(model => model.Month.id, Model.MonthList, "--Select a Month--") ... month_id... ??下拉与month_id无关。如果选择了月份,则将该月份的id复制到month_id,这是Salary的属性。否则,应禁用创建链接
【解决方案2】:

【讨论】:

  • 为什么在需要的时候让id 可以为空?
  • 如果是int,则默认添加date-val-required 属性 - typeof int 的属性始终是必需的,因为它不能为空。 [Required] 属性是不必要的,除非您想使用 ErrorMessage="someMessage" 覆盖默认错误消息
【解决方案3】:

指定范围属性

[Required]
[Range(1, 12, ErrorMessage="Please select a value")]
public int Id { get; set; }

来源:MVC3 validation with data-annotation?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多