我似乎无法覆盖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”
我在这里缺少什么?
答案 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()
方法,这就是您现在分配的方式。