继承数据注释StringLengthAttribute

时间:2018-10-15 02:59:21

标签: c# asp.net-mvc data-annotations custom-attributes

我想通过继承StringLengthAttribute创建一个自定义属性。这样做的原因是因为我需要使用动态错误消息。默认的ErrorMessage仅支持常量消息。当我使用不带恒定消息的默认验证时,它可以正常工作。

public class CustomerProfile
{
    public string Username { get; set; }
    [StringLength(10,ErrorMessage ="Original Error Message")]
    public string Name { get; set; }
    public string Mobile { get; set; }
    public string Email { get; set; }
}

enter image description here

但是当我使用下面的代码创建自定义消息时,它显示为弹出警报框,而不是在文本框上方显示验证消息。

public class CustomerProfile
{
    public string Username { get; set; }
    //[StringLength(10,ErrorMessage ="Original Error Message")]
    [MaxNameLengthAttributes(10)]
    public string Name { get; set; }
    public Gender Gender { get; set; }
    public string Mobile { get; set; }
    public string Email { get; set; }
}

public class MaxNameLengthAttributes : StringLengthAttribute
{
    private readonly int _maxWords;

    public MaxNameLengthAttributes(int maxWords) : base(maxWords)
    {
        _maxWords = maxWords;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null)
            return new ValidationResult("Name required");

        var textValue = value.ToString();

        if (textValue.Length <= _maxWords)
            return ValidationResult.Success;

        var errorMessage = string.Format("max length is {0}",_maxWords);

        return new ValidationResult(errorMessage);
    }
}

enter image description here

如何通过继承默认属性来创建自定义消息,并在文本框而不是弹出警报框上方显示验证消息?

备注:

如果继承StringLength属性,则可以正常使用而不使用IClientValidatable。而且消息应该不会成为弹出警报,缺少任何一部分?

1 个答案:

答案 0 :(得分:-1)

 [Remote("MaxNameLengthAttributes", "ControllerName", AdditionalFields = "Id", HttpMethod = "POST", 
      ErrorMessage = "max length is 10")]
 public virtual string Name { get; set; }

然后您可以在控制器中添加类似的方法

    [HttpPost]
    public JsonResult MaxNameLengthAttributes(string Name, long? id)
    {
       if(Name.Length<10)
         return Json(false);
       else 
          return Json(true);
    }

也许对您有帮助。