【发布时间】:2014-06-07 13:54:36
【问题描述】:
我有一个自定义MinAttribute,我想用它来验证用户输入是否大于给定值。
我已经能够在服务器端实现它,但无法使用不显眼的验证使其在客户端工作。
我的模特:
[Required(ErrorMessage = "{0} is Required.")]
[Display(Name = "Total")]
[Min(25, ErrorMessage = "You need to enter at least 25")]
[DataType(DataType.Currency)]
public Decimal Total{ get; set; }
MinAttribute.cs:
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public class MinAttribute : ValidationAttribute, IClientValidatable
{
private decimal MinValue { get; set; }
public MinAttribute(int minValue)
{
MinValue = minValue;
}
public override bool IsValid(object value)
{
if (value != null)
{
if (value is decimal)
{
if ((decimal)value >= MinValue)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
return true;
}
public override string FormatErrorMessage(string name)
{
if (this.ErrorMessage.IsNullOrEmpty())
return string.Format("{0} must be greater than or equal to {1}", name, MinValue);
else
return this.ErrorMessage;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (IsValid(value))
{
return ValidationResult.Success;
}
else
{
var errorMsg = FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(errorMsg);
}
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "min"
};
}
}
我被困的地方是我不确定 jQuery 应该是什么样子。我试过了:
$.validator.addMethod("min", function (value, element) {
return value > 25;
});
和
$.validator.unobtrusive.adapters.add("min", function (options) {
options.messages["min"] = options.message;
});
但一直无法让它正常工作..
有什么我明显做错了吗?
视图输出的 html 包含所有必要的data- 属性:
<input class="input text valid" data-val="true" data-val-min="You need to enter at least 25" data-val-number="The field Total must be a number." data-val-required="Total is Required." id="Total" maxlength="7" name="Total" style="width:125px;" type="tel" value="0">
所以 jQuery 实现一定有问题。 我已经包含了对 js 文件的适当引用,因为不显眼的验证正在处理其他字段..
谢谢。
我也愿意接受更好的方法来实现这一点。我没有使用范围,因为我想为 min 和 max 提供不同的错误消息,而不是通用的“必须在 X 和 Y 之间”
我也尝试过使用validator.unobtrusive.adapters.addMinMax(),但找不到任何有关如何使用它的详细文档并且无法使其工作。
【问题讨论】:
标签: jquery asp.net-mvc validation asp.net-mvc-4 unobtrusive-validation