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