加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 通用列表属性的必需属性

发布时间:2020-12-15 18:39:21 所属栏目:asp.Net 来源:网络整理
导读:是否可以将[必需]属性放在List属性? 我在POST上绑定一个通用列表,并且想知道如果属性中有0个项目,是否可以使ModelState.IsValid()失败? 解决方法 将“必需”属性添加到列表样式属性不会真正做到您想要的。如果列表未创建,则将抱怨,但如果列表中存在0项
是否可以将[必需]属性放在List<>属性?

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

解决方法

将“必需”属性添加到列表样式属性不会真正做到您想要的。如果列表未创建,则将抱怨,但如果列表中存在0项,则不会抱怨。

但是,应该很容易得出自己的数据注释属性,并使其检查Count>的列表。这样的东西(尚未测试):

[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);
    }
}

编辑:

您还必须小心如何在视图中绑定列表。例如,如果绑定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模型binder将始终将5个元素放在列表中,即所有的String.Empty。如果这是您的View如何工作,您的属性将需要更复杂,例如使用Reflection来拉取通用类型参数并将每个列表元素与默认(T)或某些东西进行比较。

一个更好的选择是使用jQuery动态创建输入元素。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读