通用列表属性的必需属性

2023-12-07

是否可以将 [Required] 属性放到 List 属性上?

我绑定到 POST 上的通用列表,想知道如果属性中有 0 个项目,是否可以使 ModelState.IsValid() 失败?


添加Required列表样式属性的属性并不能真正实现您想要的功能。如果未创建列表,则会抱怨,但如果列表中存在 0 个项目,则不会抱怨。

但是,派生您自己的数据注释属性并使其检查列表应该很容易Count> 0.类似这样的(尚未测试):

[AttributeUsage(AttributeTargets.Property)]
public sealed class CannotBeEmptyAttribute : ValidationAttribute
{
    private const string defaultError = "'{0}' must have at least one element.";
    public CannotBeEmptyAttribute ( ) : base(defaultError) //
    { 
    }

    public override bool IsValid ( object value )
    {
      IList list = value as IList;
      return ( list != null && list.Count > 0 );
    }

    public override string FormatErrorMessage ( string name )
    {
        return String.Format(this.ErrorMessageString, name);
    }
}

EDIT:

您还必须小心如何在视图中绑定列表。例如,如果您绑定List<String>到这样的视图:

<input name="ListName[0]" type="text" />
<input name="ListName[1]" type="text" />
<input name="ListName[2]" type="text" />
<input name="ListName[3]" type="text" />
<input name="ListName[4]" type="text" />

MVC 模型绑定器将always将 5 个元素全部放入列表中String.Empty。如果这就是您的视图的工作方式,您的属性将需要变得更复杂一点,例如使用反射来拉取通用类型参数并将每个列表元素与default(T)或者其他的东西。

更好的替代方法是使用 jQuery 动态创建输入元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通用列表属性的必需属性 的相关文章

随机推荐