我在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”>;您的应用是否包括应用内购买?</标签>;
<;div class=“控件”>;
@Html.CheckBoxFor(o=>;o.InAppPurchase)
@LabelFor(o=>;o.InAppPurchase,“是”)
</部门>;
</部门>;
<;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”>;应用程序内购买的应用程序星期五促销价格:</标签>;
<;div class=“控件”>;
@Html.TextBoxFor(o=>;o.InAppPurchasePromotionalPrice,new{title=“这应该是免费或0.99美元的最低价格层,仅适用于您的应用程序星期五日期。”)
<;span class=“help inline”>;
@Html.ValidationMessageFor(o=>;o.InAppPurchasePromotionalPrice)
</span>;
</部门>;
</部门>;
这段代码工作得很好,但是当我提交表单时,服务器上会请求一篇完整的文章来显示消息。因此,我创建了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和教程中找到的建议方法
当然,我也在表单中插入了所需的脚本:
- jquery.unobtrusive-ajax.min.js
- jquery.validate.min.js
- jquery.validate.unobtrusive.min.js
- 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的参数值
验证规则