C# ASP.NET Core 2-默认数字输入验证将覆盖自定义客户端验证

C# ASP.NET Core 2-默认数字输入验证将覆盖自定义客户端验证,c#,jquery,validation,asp.net-core,C#,Jquery,Validation,Asp.net Core,我有两个输入需要相互验证。它们是最小值和最大值。以下是我的观点中定义它们的部分 以下是它们映射到的属性: [显示(Name=“最小管道”)] [MinToValidation(“MaxTubes”)] public int MinTubes{get;set;} [显示(Name=“Max Tubes”)] [MaxToValidation(“MinTubes”)] 公共整数maxtube{get;set;} 这会产生带有标签和验证消息的元素 我已经创建了两个自定义验证属性来使用它们。我将只

我有两个输入需要相互验证。它们是最小值和最大值。以下是我的观点中定义它们的部分


以下是它们映射到的属性:

[显示(Name=“最小管道”)]
[MinToValidation(“MaxTubes”)]
public int MinTubes{get;set;}
[显示(Name=“Max Tubes”)]
[MaxToValidation(“MinTubes”)]
公共整数maxtube{get;set;}
这会产生带有标签和验证消息的
元素

我已经创建了两个自定义验证属性来使用它们。我将只发布
MaxToValidationAttribute
类,因为另一个类在功能上是相同的


使用Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
使用制度;
使用System.ComponentModel.DataAnnotations;
命名空间CCM_Util.CustomAttributes
{
公共类MaxToValidationAttribute:ValidationAttribute,IClientModelValidator
{
公共MaxToValidationAttribute(字符串最小值)
:base(“{0}必须大于或等于{1}”)
{
Min=Min;
}
公共字符串Min{get;set;}
公共字符串FormatErrorMessage(字符串名称、字符串名称)
{
返回string.Format(ErrorMessageString,name,minName);
}
受保护的覆盖验证结果
IsValid(对象第一个值,ValidationContext ValidationContext)
{
var FirstCompariable=作为iCompariable的firstValue;
var SecondCompariable=GetSecondCompariable(validationContext);
if(firstComparable!=null&&secondComparable!=null)
{
如果(第一个可比。比较到(第二个可比)<0)
{
object obj=validationContext.ObjectInstance;
var thing=obj.GetType().GetProperty(最小值);
var displayName=(DisplayAttribute)Attribute.GetCustomAttribute(thing,typeof(DisplayAttribute));
返回新的ValidationResult(
FormatErrorMessage(validationContext.DisplayName,DisplayName.GetName());
}
}
返回ValidationResult.Success;
}
受保护的IComparable GetSecondCompariable(
ValidationContext(验证上下文)
{
var propertyInfo=validationContext
.ObjectType
.GetProperty(最小值);
if(propertyInfo!=null)
{
var secondValue=propertyInfo.GetValue(
validationContext.ObjectInstance,null);
返回第二个值作为i可比较;
}
返回null;
}
public void AddValidation(ClientModelValidationContext上下文)
{
添加(“数据值min”,min);
Add(“data val ismax”、“true”);
}
}
}
然后,在Default.js中,我将以下函数作为我的
document.ready
函数的一部分运行

函数minMaxValidate(){
$(“输入[data val ismin='true'])。每个(函数(i,ele){
$(ele).更改(函数(){
var maxName=$(this.attr(“数据值最大”);
var minName=$(this.attr(“name”);
var minValue=parseFloat($(this.val());
var max=$(“输入[data val ismax='true'][name=”+maxName+“]]);
var maxValue=max.val();
如果(maxValue==“”){return}
maxValue=parseFloat(maxValue);
var validationMessage=$(“span[data valmsg for='”+$(this.attr(“name”)+”]);
如果(最小值>最大值){
validationMessage.html(minName+”不能大于“+maxName”);
makeError(validationMessage);
}
否则{
validationMessage.html(“”);
makeValid(validationMessage);
}
});
});
$(“输入[data val ismax='true'])。每个(函数(i,ele){
$(ele).更改(函数(){
var minName=$(this.attr(“数据值min”);
var maxName=$(this.attr(“name”);
var maxValue=parseFloat($(this.val());
var min=$(“输入[data val ismin='true'][name=''+minName+']);
var minValue=min.val();
if(minValue==“”){return}
minValue=parseFloat(minValue);
var validationMessage=$(“span[data valmsg for='”+$(this.attr(“name”)+”]);
如果(最小值>最大值){
validationMessage.html(maxName+”不能小于“+minName”);
makeError(validationMessage);
}
否则{
validationMessage.html(“”);
makeValid(validationMessage);
}
});
});
}
makeError
makeValid
函数本质上只是将
validationMessage
的类分别更改为
fieldvalidationerror
fieldvalidationvalid
,它们管理提交处理程序

我知道这种类型的验证设置是有效的,因为我在其他地方使用它时不会遇到麻烦

我已经通过了变更处理程序,他们正在按照他们应该的方式工作。但是,在错误消息显示且代码退出后,它将再次消失。我的猜测是.NET的默认数字输入验证正在接管,因为输入都是有效数字,所以它会删除错误消息

有没有办法禁用.NET对数字类型输入的默认验证,这样我就可以自己处理它,而不会让外部黑盒代码弄乱我的东西

谢谢

编辑:

下面是完整的view和Default.js文件,我只想