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

时间:2016-02-03 17:04:38

标签: c# asp.net-mvc

视图将在名称或日期上显示搜索。问题是ValidationSummary(根据类)要求输入两个值,并将为未显示的字段/属性添加错误。当搜索只提示名称时,有没有办法阻止它要求日期?就像禁用相关的数据注释一样?

注意:为简单起见,代码已缩短,仅用于ilustration。如果你发现缺少&#34 ;;"请不要投票。或类似的。

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>

1 个答案:

答案 0 :(得分:0)

像丹尼尔在上面的评论中所建议的那样使用像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.");
}