3

我一直在使用引导模式来显示来自父页面的创建表单。表单可以正常工作,因为它按照我想要的方式将数据添加到数据库中。它显示 [Required] 注释的错误消息,如果有任何错误,则不允许表单保存数据。

问题在于显示我的自定义验证属性包含的验证消息。我还注意到它没有在我自己的ValidationAttributes中触发IsValid函数。

这就是我的 ValidationAttributes 的样子:

    public class FormulaSyntaxValidationAttribute : ValidationAttribute
{
    public FormulaSyntaxValidationAttribute()
        : base("The given formula is not formatted correctly.")
    { 

    }
    public override bool IsValid(object value)
    {
        return DbManager.ValidateStringIfValidFormula(value.ToString());
    }
}

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FormulaVariableValidationAttribute : ValidationAttribute
{
    public FormulaVariableValidationAttribute()
        : base("The given formula contains other variables instead of `g` or `G` (Gross Salary).")
    {

    }
    public override bool IsValid(object value)
    {
        return DbManager.ValidateFormulaVariables(value.ToString());
    }
}

虽然这是使用定义属性的模型:

    public partial class Formula
{
    public int FormulaId { get; set; }
    public int DeductionId { get; set; }

    [Required]
    [FormulaSyntaxValidation]
    [FormulaVariableValidation]
    [Display(Name = "Formula")]
    public string FormulaStatement { get; set; }

    [Required]
    [Display(Name = "Minimum Value")]
    public decimal MinimumValue { get; set; }

    [Required]
    [Display(Name = "Maximum Value")]
    public decimal MaximumValue { get; set; }

    public virtual Deduction Deduction { get; set; }
}

我使用在 SO 中也找到的简单 javascript 来显示验证消息。这是它的样子。

    (function ($) {
    $(document).ready(function () {
        $("#addFormulaModal").draggable({
            handle: ".modal-header"
        });

        $('#addFormulaModal').on('shown', function () {
            $('#addFormulaModal').removeData("validator");
            $('#addFormulaModal').removeData("unobtrusiveValidation");
            $.validator.unobtrusive.parse($("#formCreateFormula"));
        });

        $('#addFormulaModal').on('hidden', function () {
            location.reload(true);
        })


        $('#formCreateFormula').submit(function (event) {
            event.preventDefault();
            $(this).find('div.control-group').each(function () {
                if ($(this).find('span.field-validation-error').length == 0) {
                    $(this).removeClass('error');
                }
            });

            if (!$(this).valid()) {
                $(this).find('div.control-group').each(function () {
                    if ($(this).find('span.field-validation-error').length > 0) {
                        $(this).addClass('error');
                    }
                });
            }
        });

        $('#createFormSubmit').each(function () {
            $(this).find('div.control-group').each(function () {
                if ($(this).find('span.field-validation-error').length > 0) {
                    $(this).addClass('error');
                }
            });
        });

    });
})(jQuery);

var page = function () {

    $.validator.setDefaults({
        highlight: function (element) {
            $(element).closest(".control-group").addClass("error");
        },
        unhighlight: function (element) {
            $(element).closest(".control-group").removeClass("error");
        }
    });
}();

提前致谢。

4

0 回答 0