Jquery mvc3自定义验证属性没有';无法在客户端验证
创建了一个自定义验证属性,我希望它也能在客户端工作。这是模型课Jquery mvc3自定义验证属性没有';无法在客户端验证,jquery,asp.net-mvc-3,validation,Jquery,Asp.net Mvc 3,Validation,创建了一个自定义验证属性,我希望它也能在客户端工作。这是模型课 public class CreditCardAttribute : ValidationAttribute, IClientValidatable { public override bool IsValid(object value) { var number = Convert.ToString(value); return IsValid
public class CreditCardAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
var number = Convert.ToString(value);
return IsValidNumber(number);
}
private bool IsValidNumber(string number)
{
int[] DELTAS = new int[] { 0, 1, 2, 3, 4, -4, -3, -2, -1, 0 };
int checksum = 0;
char[] chars = number.ToCharArray();
for (int i = chars.Length - 1; i > -1; i--)
{
int j = ((int)chars[i]) - 48;
checksum += j;
if (((i - chars.Length) % 2) == 0)
checksum += DELTAS[j];
}
return ((checksum % 10) == 0);
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule {
ErrorMessage = this.ErrorMessage,
ValidationType = "CreditCard"
};
}
}
我不确定什么应该转到CreditCardTest,我想把模型中的内容重写到这里吗
谢谢是的,如果要验证客户端,需要编写服务器端验证代码的JavaScript版本。(因为这是要问的问题,是时候回家了。)验证信用卡号可能是您不想对其实施客户端验证的事情 但是,如果您对如何在一般情况下实现它感兴趣,您必须用javascript在服务器上实现相同的逻辑 自定义验证属性只有一个问题,即验证类型的名称必须只包含小写字母:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "creditcard" // this should be only lowercase letters
};
}
public IEnumerable GetClientValidationRules(ModelMetadata元数据,ControllerContext上下文)
{
返回新的ModelClientValidationRule
{
ErrorMessage=this.ErrorMessage,
ValidationType=“creditcard”//这只能是小写字母
};
}
一旦我们确定可以在客户机上实现相同的验证逻辑:
@model MyViewModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
var isValidNumber = function (value, element, params) {
var DELTAS = [0, 1, 2, 3, 4, -4, -3, -2, -1, 0];
var checksum = 0;
for (var i = value.length - 1; i > -1; i--) {
var j = value.charCodeAt(i) - 48;
checksum += j;
if (((i - value.Length) % 2) == 0) {
checksum += DELTAS[j];
}
}
return (checksum % 10) == 0;
};
jQuery.validator.addMethod('CreditCardtest', isValidNumber);
jQuery.validator.unobtrusive.adapters.add('creditcard', { }, function (options) {
options.rules['CreditCardtest'] = true;
options.messages['CreditCardtest'] = options.message;
});
</script>
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Number)
@Html.ValidationMessageFor(x => x.Number)
<button type="submit">OK</button>
}
@model MyViewModel
var isValidNumber=函数(值、元素、参数){
变量增量=[0,1,2,3,4,-4,-3,-2,-1,0];
var校验和=0;
对于(var i=value.length-1;i>-1;i--){
var j=值。charCodeAt(i)-48;
校验和+=j;
如果((i-值长度)%2)==0){
校验和+=增量[j];
}
}
返回值(校验和%10)=0;
};
jQuery.validator.addMethod('CreditCardtest',isValidNumber);
jQuery.validator.unobtrusive.adapters.add('creditcard',{},函数(选项){
options.rules['CreditCardtest']=true;
options.messages['CreditCardtest']=options.message;
});
@使用(Html.BeginForm())
{
@EditorFor(x=>x.Number)
@Html.ValidationMessageFor(x=>x.Number)
好啊
}
显然,所有脚本内容都放在一个单独的文件中,而不是在视图中。为了便于阅读,我把它放在这里。你真的想用javascript编写一个信用卡验证算法吗?并不是说这是一个秘密,但对我来说似乎完全没用。我不知道,但我如何才能让它工作?你是在问如何将你的C代码翻译成javascript吗?好吧,下面就是发生的事情,我在模型中添加了
iclientvalidable
,我完全删除了jquery代码,它就工作了。我认为它需要jQuery部分才能工作?什么工作?如果删除了jQuery代码,您希望发生什么客户端验证?
@model MyViewModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
var isValidNumber = function (value, element, params) {
var DELTAS = [0, 1, 2, 3, 4, -4, -3, -2, -1, 0];
var checksum = 0;
for (var i = value.length - 1; i > -1; i--) {
var j = value.charCodeAt(i) - 48;
checksum += j;
if (((i - value.Length) % 2) == 0) {
checksum += DELTAS[j];
}
}
return (checksum % 10) == 0;
};
jQuery.validator.addMethod('CreditCardtest', isValidNumber);
jQuery.validator.unobtrusive.adapters.add('creditcard', { }, function (options) {
options.rules['CreditCardtest'] = true;
options.messages['CreditCardtest'] = options.message;
});
</script>
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Number)
@Html.ValidationMessageFor(x => x.Number)
<button type="submit">OK</button>
}