MVC 5 - 自定义验证 - DropDownList 选择值然后需要其他控件

MVC 5 - Custom Validation – DropDownList selected value then other control required

我目前有一个带有一些下拉列表和其他控件的视图。我现在几乎可以在选择某个选项时正常工作,然后需要其他控件。我现在只设置了那个 1 条件。

我想征求一些建议,我是否应该为每个控件设置一个 bool 属性,如果它为 true,则允许它通过,否则将其设置为 false。

我还想问一下,如何为我正在检查的每个 属性 设置一条消息?如果选择了其他 ddl 中的某个值,我有 2 个文本框和 1 个其他 DDL 需要一个值。这是我目前拥有的。

你会怎么做?如果 usage = 2 那么所需的项目、数量和单位不能为 null,如果每句话是假的,我怎么能有一条消息呢?

型号:

//[CheckDropDown(ErrorMessage = "When Usage = '2' Quantity and Units CAN'T be NULL!")]
        [Required]
        [CheckDropDown]
        public int Usage { get; set; }

        /* INT OR STRING ?? */
        /* If USAGE selection no imm reqs pass else REQPROJ required */        
        [Display(Name = "Required Project(s)")]
        public string RequiredProject { get; set; }

       // [Required]
        [Range(0, Int32.MaxValue)]
        //[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:#}")]
        public int Quantity { get; set; }

        //if quantity picked than units required
       // [Required]
        public int? Units { get; set; }

查看:

<div class="form-group row">
  <div class="col-md-4 col-lg-4">
    @Html.LabelFor(x => x.Usage,
          htmlAttributes: new { @class = "control-label" })
  </div>
  <div class="col-md-8 col-lg-8">
    @Html.DropDownListFor(x => x.Usage,
          (IEnumerable<SelectListItem>)ViewBag.UsageDDL,
          "", new { @class = "form-control" })
    @Html.ValidationMessageFor(x => x.Usage, "",
          new { @class = "text-danger" })
  </div>
</div>

<div class="form-group row">
  <div class="col-md-4 col-lg-4">
    @Html.LabelFor(x => x.RequiredProject,
          htmlAttributes: new { @class = "control-label" })
  </div>
  <div class="col-md-8 col-lg-8">
    @Html.EditorFor(x => x.RequiredProject, new {
        htmlAttributes =
          new { @class = "form-control" }
    })
    @Html.ValidationMessageFor(x => x.RequiredProject, "",
          new { @class = "text-danger" })
  </div>
</div>

@* Think about Textboxes on SAME line or SEPERATE *@
<div class="form-group row">
  <div class="col-md-4 col-lg-4">
    @Html.LabelFor(x => x.Quantity,
          htmlAttributes: new { @class = "control-label" })
  </div>
  <div class="col-md-8 col-lg-8">
    @Html.EditorFor(x => x.Quantity, new {
        htmlAttributes =
          new { @class = "form-control", @type = "number" }
    })
    @Html.ValidationMessageFor(x => x.Quantity, "",
          new { @class = "text-danger" })
  </div>
</div>

<div class="form-group row">
  <div class="col-md-4 col-lg-4">
    @Html.LabelFor(x => x.Units,
          htmlAttributes: new { @class = "control-label" })
  </div>
  <div class="col-md-8 col-lg-8">
    @Html.DropDownListFor(x => x.Units,
          (IEnumerable<SelectListItem>)ViewBag.UnitsDDL,
          "", new { @class = "form-control" })
    @Html.ValidationMessageFor(x => x.Units, "",
          new { @class = "text-danger" })
  </div>
</div>

自定义验证方法:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {
                //return base.IsValid(value, validationContext);

                //var model = (CustomVaildModel)validationContext.ObjectInstance;
                var model = (PartNumberViewModel)validationContext.ObjectInstance;

                // Allow value 1 to have choices as well
                //if(model.Usage == "1" && model.RequiredProject != null)
                if(model.Usage == 1)
                {
                    if(model.RequiredProject != null)
                    {
                        var errorMsg = "If there are 'No Immediate Requirements' for this part number, then a 'Required Project' is not necessary.";
                        return new ValidationResult(errorMsg);
                    }
                    else
                    {
                        return ValidationResult.Success;
                    }                    
                }
                else if(model.Usage == 2 && model.RequiredProject == null && model.Quantity.Equals(0) && model.Units == null)
                {
                    //FormatErrorMessage(validationContext.DisplayName);
                    var errorMsg = "When Usage = 'Procure for Projects listed' Quantity and Units CANNOT BE EMPTY!";
                    return new ValidationResult(errorMsg);                   
                }
                else
                {
                    return ValidationResult.Success;
                }
            }
        }

您也可以在控制器的操作中进行验证:

public ActionResult SomeAction(TheModel model)
{
    if (model.Usage == 2)
    {
        if (model.Quantity == null) // quantity is changed to nullable
        {
            ModelState.AddModelError("Quantity", "Value is required for this usage");
        }
    }

    ....
    if (ModelState.IsValid)
    {
        ...
    }
    else
    {
        return View(model); // there are validation errors
    }
}