Проверка минимального возраста с форматом даты дд / мм / гггг в клиентской модели - PullRequest
0 голосов
/ 17 июня 2019

Вот моя проверка на стороне клиента

    (function ($) {
        // Here I will add code for client side validation for our custom validation (age range validation)

        $.validator.unobtrusive.adapters.add("minimumage", ["minage"], function (options) {
            options.rules["minimumage"] = options.params;
            options.messages["minimumage"] = options.message;
        });

        $.validator.addMethod("minimumage", function (value, elements, params) {
            if (value) {
                var valDate = new Date(value);
                if ((new Date().getFullYear() - valDate.getFullYear()) < parseInt(params.minage)
                ) {
                    return false;
                    //validation failed
                }
            }
            return true;
        });
    })(jQuery);

Model.cs

    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "BirthdayMandatory")]
    [Display(Name = "Birthday", ResourceType = typeof(Resources.Resources))]
    [MinimumAge(MinAge = 16, ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "MinimumAgeMessage")]
    [DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime? Birthday { get; set; }

Page.cshtml

            <div class="form-group">
                @Html.LabelFor(model => model.Birthday, new { @class = "control-label" })
                @Html.TextBoxFor(model => model.Birthday, "{0:dd/MM/yyyy}", new { @class = "form-control", @name = "date", placeholder = "dd/mm/yyyy" })
                @Html.ValidationMessageFor(model => model.Birthday)
            </div>

Вот это MinimumAgeAttribute:

public class MinimumAgeAttribute : ValidationAttribute, IClientValidatable
{

    public int MinAge { get; set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        //THIS IS FOR SERVER SIDE VALIDATION

        // if value not supplied then no error return
        if (value == null)
        {
            return null;
        }

        int age = 0;
        age = DateTime.Now.Year - Convert.ToDateTime(value).Year;
        if (age >= MinAge)
        {
            return null; // Validation success
        }
        else
        {
            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
            // error 
        }
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        //THIS IS FOR SET VALIDATION RULES CLIENT SIDE

        var rule = new ModelClientValidationRule()
        {
            ValidationType = "minimumage",
            ErrorMessage = FormatErrorMessage(metadata.DisplayName)
        };

        rule.ValidationParameters["minage"] = MinAge;
        yield return rule;
    }
}

Тогда при проверке ошибки всегда отображается ошибка Birthday must be a date при вводе даты выше 12. Например. 20/02/1991

Я исправил это так:

    //to correct dd/mm/yyyy bug in asp validation
    $(function () {
        $.validator.methods.date = function (value, element) {
            return this.optional(element) || moment(value, "DD/MM/YYYY", true).isValid();
        }
    });

Но проверка минимального возраста становится неработоспособной.

Пожалуйста, помогите

1 Ответ

0 голосов
/ 18 июня 2019

После поиска в течение многих часов я не нахожу удовлетворительных ответов.

В итоге я использовал проверку JavaScript:

  1. Измените тип данных ModelView на строкувместо даты, а затем преобразуйте его соответствующим образом.

  2. Запустите пользовательский метод проверки JavaScript

            <div class="form-group">
                @Html.LabelFor(model => model.Birthday, new { @class = "control-label" })
                @Html.TextBoxFor(model => model.Birthday, new { id = "birthday-input-txt", @class = "form-control", type = "text", placeholder = "dd/mm/yyyy", onblur = "ValidateDOB()" })
                @Html.ValidationMessageFor(model => model.Birthday, "", new { id = "birthday-error-message" })
            </div>
    

Javascript:

    function ValidateDOB() {
        var lblError = $("#birthday-error-message");
        //Get the date from the TextBox.
        var dateString = $("#birthday-input-txt").val();
        var regex = /^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/;

        //also fire existing validation
        $("#update-profile-form").valid();

        //Check whether valid dd/MM/yyyy Date Format.
        if (regex.test(dateString)) {
            var parts = dateString.split("/");
            var dtDOB = new Date(parts[1] + "/" + parts[0] + "/" + parts[2]);
            var dtCurrent = new Date();
            lblError.html("@Resources.Resources.MinimumAgeMessage");
            if (dtCurrent.getFullYear() - dtDOB.getFullYear() < 16) {
                lblError.addClass('field-validation-error').removeClass('field-validation-valid');
                return false;
            }

            if (dtCurrent.getFullYear() - dtDOB.getFullYear() == 16) {

                //CD: 11/06/2018 and DB: 15/07/2000. Will turned 16 on 15/07/2018.
                if (dtCurrent.getMonth() < dtDOB.getMonth()) {
                    lblError.addClass('field-validation-error').removeClass('field-validation-valid');
                    return false;
                }
                if (dtCurrent.getMonth() == dtDOB.getMonth()) {
                    //CD: 11/06/2018 and DB: 15/06/2000. Will turned 18 on 15/06/2018.
                    if (dtCurrent.getDate() < dtDOB.getDate()) {
                        lblError.addClass('field-validation-error').removeClass('field-validation-valid');
                        return false;
                    }
                }
            }
            //lblError.innerHTML = "";
            lblError.addClass('field-validation-valid').removeClass('field-validation-error');
            return true;
        } else {
            lblError.html("@Resources.Resources.WrongDateFormatMsg")
            lblError.addClass('field-validation-error').removeClass('field-validation-valid');
            return false;
        }
    }

Кроме того, запустите его перед отправкой:

<input type="submit" value="@Resources.Resources.Save" class="btn" onclick="return ValidateDOB()" />

Эта ссылка очень помогает: https://www.aspsnippets.com/Articles/Date-of-Birth-Age-Validation-in-JavaScript.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...