【问题标题】:MVC4 jQuery unobtrusive validation of Min valueMVC4 jQuery 不显眼地验证最小值
【发布时间】: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


    【解决方案1】:

    如果你查看 jquery.validate.unobtrusive(.min).js,你会看到:

    adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
    

    换句话说,已经有一个名为“min”的适配器。您是否尝试过使用其他名称?

    【讨论】:

    • 我将所有Mins 更改为Mini,因此模型属性为Mini 类为MiniAttribute 更新了JS 以使用mini,但仍然在做同样的事情。没有 chrome 控制台错误,只是没有验证客户端。
    • 其实已有的适配器被命名为“length”和“range”,而range适配器使用“min”和“max”属性来定义允许的范围。
    • 排除显而易见的问题:确保输入元素在表单中,并将其类型设置为文本。
    • 我检查了输入并将其从 tel 类型更改为文本,重新尝试了上述所有组合,但仍然无法正常工作。当然有一种更简单的方法来验证客户端的最小/最大值..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2012-11-17
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多