3

親ページから作成フォームを表示するために、ブートストラップ モーダルを使用しています。フォームは、希望どおりにデータベースにデータを追加するため、正常に機能します。[必須] 注釈のエラー メッセージを表示し、エラーがある場合、フォームがデータを保存することを許可しません。

問題は、カスタム検証属性に含まれる検証メッセージを表示することにあります。また、自分の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