是否可以在运行时绕过类中的数据注释

本文关键字:数据 注释 运行时 是否 | 更新日期: 2023-09-27 18:33:08

视图将显示"名称"或"日期"的搜索。问题是验证摘要(根据类)要求输入两个值,并且会为未显示的字段/属性添加错误。有没有办法防止它在搜索仅提示输入名称时需要日期?喜欢禁用相关的数据注释?

注意:为简单起见,代码已缩短,仅用于阐明。如果您发现缺少";"或类似内容,请不要投票否决。

public class CustomSearch
{
    [Required(ErrorMessage = "The text must be filled in.")]
    public string SearchTextValue { get; set; }
    [Required(ErrorMessage = "The Date must be selected.")]
    public string SearchDateValue { get; set; }
}
<div>
   <div>
      @if (Model.SearchValidationSummary) { @Html.ValidationSummary(false) }
   <div>
   @using (Html.BeginForm("", "", FormMethod.Post ))
    {
        if (Model.SearchText) { @Html.TextBoxFor(m => m.SearchTextValue) }
        else if (Model.SearchDate) { @Html.DateEditFor(m => m.SearchDateValue) }
    }
</div>

是否可以在运行时绕过类中的数据注释

正如Daniel在上面的评论中建议的那样,使用像RequiredIf注释这样的东西可能是最优雅的解决方案,但为了完整起见,这里有其他选择。

首先,您只能删除错误。大致如下:

if (searchType = "text")
{
    ModelState["SearchDateValue"].Errors.Clear();
}
if (searchType = "date")
{
    ModelState["SearchTextValue"].Errors.Clear();
}

基本上,无论进行哪种类型的搜索,您都只需清除其他字段的错误。

其次,您可以手动验证,而不是依赖注释:

if (searchType == "text" && String.IsNullOrWhiteSpace(model.SearchTextValue))
{
    ModelState.AddModelError("SearchTextValue", "The text must be filled in.");
}