我编写了一个自定义属性,但它似乎不适用于客户端。它只在我调用ModelState.IsValid()方法时才在服务器上运行。我在网上看到我需要在应用程序启动方法上注册自定义属性,但目前尚不清楚。请帮忙。
public class MaximumAmountAttribute : ValidationAttribute
{
private static string defErrorMessage = "Amount available '$ {0:C}' can not be more than loan amount '$ {1:C}'";
private string MaximumAmountProperty { get; set; }
double minimumValue = 0;
double maximumValue = 0;
public MaximumAmountAttribute(string maxAmount)
: base(defErrorMessage)
{
if (string.IsNullOrEmpty(maxAmount))
throw new ArgumentNullException("maxAmount");
MaximumAmountProperty = maxAmount;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null)
{
PropertyInfo otherPropertyInfo = validationContext.ObjectInstance.GetType().GetProperty(MaximumAmountProperty);
if (otherPropertyInfo == null)
{
return new ValidationResult(string.Format("Property '{0}' is undefined.", MaximumAmountProperty));
}
var otherPropertyValue = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);
if (otherPropertyValue != null && !string.IsNullOrEmpty(otherPropertyValue.ToString()))
{
minimumValue = Convert.ToDouble(value);
maximumValue = Convert.ToDouble(otherPropertyValue);
if (minimumValue > Convert.ToDouble(otherPropertyValue.ToString()))
{
return new ValidationResult(string.Format(defErrorMessage, minimumValue, maximumValue));
}
}
}
return ValidationResult.Success;
}
}
答案 0 :(得分:2)
使用自定义验证属性创建服务器端验证不会将验证规则“转移”到客户端浏览器(呈现自定义javascript验证功能)。
您还必须将验证逻辑编写为客户端脚本。你必须做一些事情:
确保客户端上必须验证的元素(输入)如下所示:
<input data-val-MaximumAmount="Validation error massage" />
需要保存错误消息的data-val-XXX属性。 Html.TextBoxFor
正在做同样的事情(将这些属性添加到呈现的html元素中)。
您必须以这样的方式创建和注册客户端验证:
(function ($) {
// Creating the validation method
$.validator.addMethod('MaximumAmount', function (value, element, param) {
if (...) // some rule. HERE THE VALIDATION LOGIC MUST BE IMPLEMENTED!
return false;
else
return true;
});
// Registering the adapter
$.validator.unobtrusive.adapters.add('MaximumAmount', function (options) {
var element = options.element,
message = options.message;
options.rules['MaximumAmount'] = $(element).attr('data-val-MaximumAmount');
if (options.message) {
options.messages['MaximumAmount'] = options.message;
}
});
})(jQuery);
// Binding elements to validators
$(function () {
$(':input[data-val-MaximumAmount]').each(function () {
$.validator.unobtrusive.parseElement(this, true);
});
});