可为空的整数字段的自定义验证属性无法正常工作

时间:2019-01-06 16:59:21

标签: c# asp.net-mvc validation

我想向MVC Core 2.2中的可为空的整数字段添加自定义验证。到目前为止,我在实现它时遇到两个问题:

  1. 如果仅键入数字,则自定义验证有效。我还要在字符之间插入时进行验证。
  2. 当我输入数字后跟字符时,我在视图上收到标准错误消息(我无法更改)。 (例如:值“ 4r”对于页码无效。)

我已经尝试过的:

  1. 我已将项目从MVC Core 2.0升级到2.2,以便能够在“启动”下设置SuppressModelStateInvalidFilter to true以禁用默认行为。
  2. 阅读Microsoft docs
  3. 在Stackoverflow上阅读大量类似的文章
  4. 在我的项目中为整数字段添加了自定义验证。
  5. 试图使用RegEx验证数字,但据我了解,它仅适用于字符串。

我要验证的整数字段

[Display(Name = "Page number")]
[CheckIsNumber(ErrorMessage = "Only numbers please.")] //Custom Validator
[Range(1, 9999, ErrorMessage = "Page number too long.")]
public int? Pagenumber { get; set; }

我的自定义验证器

public class CustomValidation
    {
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false)]
    public sealed class CheckIsNumber : ValidationAttribute
    {
        protected override ValidationResult IsValid(object numbFromTextfield, ValidationContext validationContext)
        {
            if (numbFromTextfield != null)
            {
                string valNumb = numbFromTextfield.ToString();
                bool isNumeric = int.TryParse(valNumb, out int n);

                if (isNumeric)
                {
                    return ValidationResult.Success;
                }
                else
                {
                    return new ValidationResult("Only numbers please.");
                }
            }
            return ValidationResult.Success;
        }
    }
}

视图

<div class="form-group">
    <label asp-for="Book.Pagenumber"></label>
    <input asp-for="Book.Pagenumber" class="form-control" maxlength="4" />
    <span asp-validation-for="Book.Pagenumber" class="alert-danger"></span>
</div>

// type="number" is also not helpful

如前所述,当我输入数字后跟字符时,只会得到默认错误消息。 (Example:值“ 4r”对于页码无效。)

仅当我在字段中键入数字时,才会调用自定义验证。

我想要实现的是对可为空的整数字段进行适当的自定义验证,并且我希望摆脱默认错误消息。我怎么做? 谢谢!

0 个答案:

没有答案