【问题标题】:Custom validation for List<string> data annotation keeps showing other input that is not emptyList<string> 数据注释的自定义验证不断显示其他非空输入
【发布时间】:2020-10-18 17:59:48
【问题描述】:

我正在尝试为列表数据注释创建所需的自定义验证,但是当输入字段之一为空时,绑定到数据注释的其余输入也会显示错误消息,即使它不为空.

我试图仅向其各自的空输入显示错误。

这是我的看法:

<input name="ListName[0]" type="text" />
<span class="text-danger field-validation-valid" data-valmsg-for="ListName" data-valmsg-replace="true"/>

<input name="ListName[1]" type="text" />
<span class="text-danger field-validation-valid" data-valmsg-for="ListName" data-valmsg-replace="true"/>

 <input name="ListName[2]" type="text" />
<span class="text-danger field-validation-valid" data-valmsg-for="ListName" data-valmsg-replace="true"/>

<input name="ListName[3]" type="text" />
<span class="text-danger field-validation-valid" data-valmsg-for="ListName" data-valmsg-replace="true"/>

<input name="ListName[4]" type="text" /> 
<span class="text-danger field-validation-valid" data-valmsg-for="ListName" data-valmsg-replace="true"/>

这是我的模特

[Display(Name = "Name: ")]
[DataType(DataType.Text)]
[CannotBeEmptyAttribute(ErrorMessage = "Cannot leave name field empty")]
public List<string> ListName{ get; set; }

这是我的自定义验证

 public class CannotBeEmptyAttribute : ValidationAttribute
        {
            protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {
                var strings = value as IEnumerable<string>;

                foreach (var item in strings)
                {
                    if (item == null)
                    {
                        return new ValidationResult("Cannot leave name field empty");
                    }
                }

                return ValidationResult.Success;
            }
        }

【问题讨论】:

  • 您的验证器方法似乎不正确,我不知道当您可以使用[Required(ErrorMessage = "Cannot leave name field empty")]时为什么需要自定义验证器@
  • @derloopkat 嗨,我不能使用 required 因为它是 List 而不是 String
  • 您在 ListName 上添加自定义 validationAttribute,在 VIew 中,您将相同的验证与 list[0],list[1],list[2]... 绑定,在您的自定义验证中,一个列表的为空,它会失败,所以就像你说的but when one of the input field is empty, the rest of the input that is bind to the data annotation also shows the error message as well even though its not empty。如果你想验证它们,你也可以使用客户端验证来绑定每个。
  • @YiyiYou 是的,但是对于那些为空的输入应该如何返回错误?我不想在不为空的输入上显示这些错误
  • 如果你想使用客户端验证,你可以这样做,&lt;form method="post"&gt; &lt;label for="id"&gt;id:&lt;/label&gt; &lt;input type="text" id="id" name="id" required&gt; &lt;label for="id"&gt;Username:&lt;/label&gt; &lt;input type="text" id="username" name="username" required&gt; &lt;input type="submit"&gt; &lt;/form&gt;

标签: asp.net-mvc validation asp.net-core model-view-controller tag-helpers


【解决方案1】:

这取决于您想要哪种验证。

(1) 代码中的验证逻辑

                foreach (var item in strings)
                {
                    if (item == null)
                    {
                        return new ValidationResult("Cannot leave name field empty");
                    }
                }
            
                 return ValidationResult.Success;

当 ListName 有空字符串时返回警告。 当所有字符串都不为空时返回成功,

(2)相反的验证逻辑

                foreach (var item in strings)
                {
                    if (item != null)
                    {
                       return ValidationResult.Success;
                    }
                }

                 return new ValidationResult("Cannot leave name field empty");

仅当 ListName 的字符串为空时才返回警告。 当 ListName 至少有一个字符串不为空时返回成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多