自定义验证属性中的客户端验证-asp.net mvc 4

我在internet上阅读了一些文章和教程,以便创建一个自定义验证属性,该属性也支持asp.net mvc 4网站中的客户端验证。这就是我到目前为止所拥有的:

RequiredIfAttribute.cs

[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]//已添加
公共类requireditAttribute:ValidationAttribute,IClientValidable
{
私有只读字符串条件;
私有字符串propertyName;//已添加
公共RequiredIFtAttribute(字符串条件)
{
这个条件=条件;
this.propertyName=propertyName;//已添加
}
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
PropertyInfo PropertyInfo=validationContext.ObjectType.GetProperty(this.propertyName);//已添加
委托条件函数=CreateExpression(validationContext.ObjectType,_条件);
bool conditionMet=(bool)conditionFunction.DynamicInvoke(validationContext.ObjectInstance);
如果(满足条件)
{
如果(值==null)
{
返回新的ValidationResult(FormatErrorMessage(null));
}
}
返回ValidationResult.Success;
}
私有委托CreateExpression(类型objectType,字符串表达式)
{
LambdaExpression LambdaExpression=System.Linq.Dynamic.DynamicExpression.ParseLambda(objectType,typeof(bool),expression);//添加
委托函数=lambdaExpression.Compile();
返回函数;
}
public IEnumerable<ModelClientValidationRule>GetClientValidationRules(ModelMetadata元数据,ControllerContext上下文)
{
var modelClientValidationRule=新modelClientValidationRule
{
ValidationType=“requiredif”,
ErrorMessage=ErrorMessage//已添加
};
modelClientValidationRule.ValidationParameters.Add(“param”,this.propertyName);//已添加
返回新列表<ModelClientValidationRule>{ModelClientValidationRule};
}
}

然后,我将该属性应用于类的一个属性中,如下所示

[RequiredIf(“InAppPurchase==true”,“InAppPurchase”,ErrorMessage=“请输入应用内购买促销价格”)]//添加了“InAppPurchase”
AppPurchasePromotionalPrice{get;set;}中的公共字符串
公共bool-InAppPurchase{get;set;}

所以我想做的是显示一条错误消息,当InAppPurchase字段为true时,InAppPurchasePromotionalPrice字段是必需的(这意味着在表单中选中)。以下是视图中的相关代码:

<div class=“控制组”>
<label class=“control label”for=“InAppPurchase”>您的应用是否包括应用内购买?&lt/标签>
<div class=“控件”>
@Html.CheckBoxFor(o=>o.InAppPurchase)
@LabelFor(o=>o.InAppPurchase,“是”)
&lt/部门>
&lt/部门>
<div class=“control group”id=“InAppPurchasePromotionalPriceDiv”@(Model.InAppPurchase==true?Html.Raw(“style='display:block;”)Html.Raw(“style='display:none;”)gt;
<label class=“control label”for=“InAppPurchasePromotionalPrice”>应用程序内购买的应用程序星期五促销价格:&lt/标签>
<div class=“控件”>
@Html.TextBoxFor(o=>o.InAppPurchasePromotionalPrice,new{title=“这应该是免费或0.99美元的最低价格层,仅适用于您的应用程序星期五日期。”)
<span class=“help inline”>
@Html.ValidationMessageFor(o=>o.InAppPurchasePromotionalPrice)
&lt/span>
&lt/部门>
&lt/部门>

这段代码工作得很好,但是当我提交表单时,服务器上会请求一篇完整的文章来显示消息。因此,我创建了JavaScript代码以启用客户端验证:

requiredif.js

(函数($){
$.validator.addMethod('requiredif',函数(值、元素、参数){
/*var inAppPurchase=$(“#inAppPurchase”)。是(“:选中”);
如果(不适用于购买){
返回true;
}
返回false*/
变量isChecked=$(参数).is(':checked');
如果(已检查){
返回false;
}
返回true;
}, '');
$.validator.unobtrusive.adapters.add('requiredif',['param'],函数(选项){
options.rules[“requiredif”]=“#”+options.params.param;
options.messages['requiredif']=options.message;
});
})(jQuery);

这是我在msdn和教程中找到的建议方法

当然,我也在表单中插入了所需的脚本:

  1. jquery.unobtrusive-ajax.min.js
  2. jquery.validate.min.js
  3. jquery.validate.unobtrusive.min.js
  4. requiredif.js

但是…客户端验证仍然不起作用。你能帮我找到我错过了什么吗?提前谢谢

看看这个:http://thewayofcode.wordpress.com/tag/custom-unobtrusive-validation/

使用本教程,我可以毫无问题地运行自定义验证代码。我能在您的代码中发现的唯一区别是您创建$.validator.unobtrusive.adapters.add函数的方式。参数有点不同,但问题可能在于您没有定义适配器的规则

尝试使用类似以下内容:

$.validator.unobtrusive.adapters.add(“requiredif”、[“requiredif”]),函数(选项){
options.rules[“requiredif”]=“#”+options.params.requiredif;
options.messages[“requiredif”]=options.message;
});

还是这个

$.validator.unobtrusive.adapters.add(“requiredif”),函数(选项){
options.rules[“requiredif”]=“#”+options.element.name.replace('.','.');//mvc html帮助程序
options.messages[“requiredif”]=options.message;
});

关于规则(摘自链接):

此HTML元素的jQuery规则数组。需要适配器
为特定jQuery验证将项添加到此规则数组
它要附加的验证器。名称是jQuery的名称
验证规则,该值是jQuery的参数值
验证规则

发表评论