我有这个表单类“ 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>
实际上,在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");
}
}
}
注意模型如何:
IValidateableObject
Validate
,该方法返回类型IEnumerable<ValidationResult>
在模型绑定过程中,将自动调用此方法,并且如果返回验证结果,则该方法将ModelState
不再有效。因此,在控制器中使用此熟悉的代码将确保您不执行任何操作,除非您的自定义条件签出:
public class SomeController {
public ActionResult SomeAction() {
if (ModelState.IsValid) {
//Do your stuff!
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句