首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类属性自定义接口ValidationAttribute

类属性自定义接口ValidationAttribute
EN

Stack Overflow用户
提问于 2018-02-21 10:18:31
回答 2查看 414关注 0票数 0

我有一个类,其中包含属性'TextPair‘的列表,如下所示:

代码语言:javascript
复制
public class Student
{
    public List<TextPair> Hobbies { get; set; }
    public List<TextPair> Languages { get; set; }
    public List<TextPair> Majors { get; set; }

}

public class TextPair
{
    [StringLength(2, ErrorMessage = "The value length is invalid")]
    public string Value { get; set; }

    public string Text { get; set; }
}

在这里,我使用StringLength AttributeValidator验证最大长度2的值,并在TextPair模型的属性' value‘中进行修饰。对我来说,问题是长度总是固定的,长度总是强制的。

在我的用例中,我希望应用程序的不同部分(或同一类型的不同属性)的值具有不同的风格,以支持不同的长度。

我正在寻找下面这样的东西,我可以在我的类中传递验证,在那里我声明了我的属性'TextPair‘,也就是说,我不想让验证总是强制的,也不想硬编码值2

代码语言:javascript
复制
public class Student
{
    //Any length of the value is accepted for hobbies
    public List<TextPair> Hobbies{ get; set; }

    [ValuesLength(Length = 2, ErrorMessage = "Language code length must be 2 characters max")]
    public List<TextPair> Languages { get; set; }

    [ValuesLength(Length = 128, ErrorMessage = "The major should be within 128 characters length")]
    public List<TextPair> Majors{ get; set; }

}

有没有什么有效的方法来解决这个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-22 03:23:08

其中一种解决方案如下:

代码语言:javascript
复制
public class Student
{
    //Any length of the value is accepted for hobbies
    public List<TextPair> Hobbies{ get; set; }

    [ValuesLength(MaximumLength = 2, ErrorMessage = "Language code length must be 2 characters max")]
    public List<TextPair> Languages { get; set; }

    [ValuesLength(MaximumLength = 128, ErrorMessage = "The major should be within 128 characters length")]
    public List<TextPair> Majors{ get; set; }

}

我的自定义属性验证是检查列表并验证是否有任何元素值超过了提供的长度,如下所示:

代码语言:javascript
复制
public class ValuesLengthAttribute : ValidationAttribute
    {
        public int MaximumLength { get; set; }
        public override Boolean IsValid(object value)
        {
            Boolean isValid = true;
            var list = value as List<TextPair>;
            if (list != null && list.Count>0)
                foreach (var item in list)
                {
                    if (item.Value.Length > MaximumLength)
                        isValid = false;
                }

            return isValid;
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2018-02-21 17:21:17

也许可以尝试对StringLengthAttribute进行子类化以创建所需的ValuesLength属性。请注意,这段代码没有经过测试,只是对最终实现的建议。

代码语言:javascript
复制
public class ValuesLength : StringLengthAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var isValid = true;

        var pair = value as TextPair;
        if (pair != null && pair.Value != null)
        {
            var pairValue = pair.Value;
            isValid = pairValue.Length < MaximumLength && pairValue.Length > MinimumLength;
        }        

        return IsValid ? ValidationResult.Success : new ValidationResult(ErrorMessage);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48897208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档