MVC5中的多个验证要求

布兰登·麦卡利斯(Brandon McAlees)

我有这个表单类“ Value”,它被多次使用,“ Maximum”字段仅在某些实例中使用。如果“显示”属性为true并且显示“最大”字段,则需要验证“最大”是否具有值。提前致谢!

模型:

public class Value
{
    public bool Show { get; set; }
    public bool Required { get; set; }
    [RequiredIf("Show", Domain.Comparison.IsEqualTo, true, ErrorMessageResourceType = typeof(Resources.ErrorMessages), ErrorMessageResourceName = "AuthorLabelIsRequired")]
    public string Label { get; set; }
    public string Description { get; set; }
    [RequiredIf("Show", Domain.Comparison.IsEqualTo, true, ErrorMessageResourceType = typeof(Resources.ErrorMessages), ErrorMessageResourceName = "AuthorLabelIsRequired")]
    public int? Maximum { get; set; }
} 

HTML:

<tr>
                    <td>@Html.EnumString(Model.Data.DateSection.Key)</td>
                    <td>@Html.CheckBoxFor(m => m.Data.DateSection.Value.Show)</td>
                    <td>@Html.CheckBoxFor(m => m.Data.DateSection.Value.Required)</td>
                    <td>
                        @Html.TextBoxFor(m => m.Data.DateSection.Value.Label, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.Data.DateSection.Value.Label)
                    </td>
                    <td>@Html.TextBoxFor(m => m.Data.DateSection.Value.Description, new { @class = "form-control" })</td>
                    <td></td>
                </tr>
                <tr>
                    <td>@Html.EnumString(Model.Data.DescriptionSection.Key)</td>
                    <td>@Html.CheckBoxFor(m => m.Data.DescriptionSection.Value.Show)</td>
                    <td>@Html.CheckBoxFor(m => m.Data.DescriptionSection.Value.Required)</td>
                    <td>
                        @Html.TextBoxFor(m => m.Data.DescriptionSection.Value.Label, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.Data.DescriptionSection.Value.Label)
                    </td>
                    <td>@Html.TextBoxFor(m => m.Data.DescriptionSection.Value.Description, new { @class = "form-control" })</td>
                    <td>
                        @Html.TextBoxFor(m => m.Data.DescriptionSection.Value.Maximum, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.Data.DescriptionSection.Value.Maximum)
                    </td>
                </tr>
贾斯汀·赫尔格森(Justin Helgerson)

实际上,在ASP.NET MVC中有一种相当优雅的方法来处理条件验证。您的模型最终看起来像这样:

public class Value : IValidatableObject {
    public bool Show { get; set; }
    public bool Required { get; set; }
    [RequiredIf("Show", Domain.Comparison.IsEqualTo, true, ErrorMessageResourceType = typeof(Resources.ErrorMessages), ErrorMessageResourceName = "AuthorLabelIsRequired")]
    public string Label { get; set; }
    public string Description { get; set; }
    [RequiredIf("Show", Domain.Comparison.IsEqualTo, true, ErrorMessageResourceType = typeof(Resources.ErrorMessages), ErrorMessageResourceName = "AuthorLabelIsRequired")]
    public int? Maximum { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
        if (this.Show && !this.Maximum.HasValue) {
            yield return new ValidationResult("You must specify a maximum value");
        }
    }
}

注意模型如何:

  1. 机具 IValidateableObject
  2. 有一个名为方法Validate该方法返回类型IEnumerable<ValidationResult>

在模型绑定过程中,将自动调用此方法,并且如果返回验证结果,则该方法将ModelState不再有效。因此,在控制器中使用此熟悉的代码将确保您不执行任何操作,除非您的自定义条件签出:

public class SomeController {
    public ActionResult SomeAction() {
        if (ModelState.IsValid) {
            //Do your stuff!
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章