如何在asp.net Core 2.1中覆盖模型状态错误消息?

时间:2018-05-31 03:28:57

标签: c# modelstate asp.net-core-2.1

我似乎无法覆盖int或可为空int?的模型状态验证的错误消息。在之前的Asp.Net Core版本中我曾经收到过输入无效的信息,现在我收到了这个不友好的错误,

  

{“streetNo”:[“无法将字符串转换为整数:abc。路径'cityId',   第24行,第23位。“]}

因此我尝试使用自定义验证属性

来解决它

我创建了这个类,

 public class IsInt : ValidationAttribute {
        public IsInt () : base () { }

        public override bool IsValid (object value) {
            Console.WriteLine (value);
            if (value.IsNullObject ()) {
                return true;
            } else {
                if (value.GetType () == typeof (int?)) {
                    return true;

                } else {
                    return false;
                }
            }
        }
        protected override ValidationResult IsValid (
            Object value,
            ValidationContext validationContext) {

            var message = "Only number is allowed";
            return new ValidationResult (message);
        }
    }

我以这种方式实现它,

[IsInt]
public int? StreetNo { get; set; }

验证属性似乎没有按预期工作,如果我输入一个字符串,即“abc”我仍然收到提到的模型错误消息,它只有在字符串中有数字时才有效,即“83444”

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

我有一个类似的问题,我想覆盖这些消息,以便它们不会总是直接向用户显示“字段MyLongDescriptivePropertyName必须为数字”。事实证明,在Startup.cs中有一种简单的方法:

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // MVC
        services.AddMvc(o =>
        {
            o.ModelBindingMessageProvider.SetValueMustBeANumberAccessor(val => "Must be a number.");
        });
    }

The class description here并没有真正解释或提供示例。我发现this post很近,但是从那时起,他们就添加了Set...Accessor()方法,这就是您现在分配的方式。