Страницы Razor отображают проверку на скрытый ввод

#asp.net-core #.net-core #razor-pages

#asp.net-core #.net-core #страницы razor

Вопрос:

Я пытаюсь предоставить удобный для пользователя ввод (в процентах) для десятичной дроби и иметь возможность проверки. Я застрял, потому что asp-validation-for не будет отображаться, если соответствующий ввод скрыт.

Текущий метод заключается в использовании autonumeric.js для форматирования на стороне клиента в поле только для отображения, которое копируется в поле для сохранения в базе данных.

Как я могу получить сообщение о проверке для отображения?

LoanEstimate.cs

 [NotMapped]
public string RateDisplayOnly { get; set; }

[Range(0,1,ErrorMessage="Rate must be between 0.000% and 100.00%")]
[DisplayFormat(DataFormatString = "{0:p}")]
[Required]
public decimal? Rate { get; set; }
 

Create.cshtml

     <div class="form-group">
        <label asp-for="LoanEstimate.Rate" class="control-label"></label>
        <input asp-for="LoanEstimate.RateDisplayOnly" class="form-control autonumeric-display-only autonumeric-percent" />
        <input asp-for="LoanEstimate.Rate" class="form-control" type="hidden"/>
        <span asp-validation-for="LoanEstimate.Rate" class="text-danger"></span>
    </div>
 

Javascript

 $(document).ready(function ($) {

    //autonumeric.js field formatting
    const anElement = AutoNumeric.multiple('.autonumeric-currency', {
        currencySymbol: "$"
    });

    const anElement2 = AutoNumeric.multiple('.autonumeric-percent', {
            decimalPlaces: 3,
            rawValueDivisor: 100,
            suffixText: "%"
        }
    )
    $(".autonumeric-display-only").on('keyup', function () {
        var str = this.id
        var getThis = str.substring(0, str.indexOf("DisplayOnly"))
        $("#"   getThis).val(AutoNumeric.getNumericString("#"   this.id));
    });
    
});
 

Проблема

Сообщение о проверке не отображается при вводе для LoanEstimate.Скорость скрыта

введите описание изображения здесь

Примечание: здесь он отображается правильно, когда не скрыт
введите описание изображения здесь

Ответ №1:

Используйте $.validator.setDefaults , вот демонстрация:

Вид:

 <form method="post">
    <div class="form-group">
        <label asp-for="Rate" class="control-label"></label>
        <input asp-for="RateDisplayOnly" class="form-control autonumeric-display-only autonumeric-percent" onblur="validateRate()"/>
        <input asp-for="Rate" class="form-control" hidden />
        <span asp-validation-for="Rate" class="text-danger"></span>
    </div>
    <input type="submit" value="submit" />
</form>
 

js:

 function validateRate() {
        $("#Rate").valid();
    }
$.validator.setDefaults({
            ignore: [],
            // other default options
        });
        $(document).ready(function ($) {

            //autonumeric.js field formatting
            const anElement = AutoNumeric.multiple('.autonumeric-currency', {
                currencySymbol: "$"
            });

            const anElement2 = AutoNumeric.multiple('.autonumeric-percent', {
                decimalPlaces: 3,
                rawValueDivisor: 100,
                suffixText: "%"
            }
            )
            $(".autonumeric-display-only").on('keyup', function () {
                var str = this.id
                var getThis = str.substring(0, str.indexOf("DisplayOnly"))
                $("#"   getThis).val(AutoNumeric.getNumericString("#"   this.id));
            });

        });
 

Результат:
введите описание изображения здесь

Комментарии:

1. Спасибо! Сообщение действительно запускается при нажатии кнопки отправки. Я замечаю, что, когда поле ввода не скрыто, сообщение о проверке срабатывает, когда я выхожу из поля <input asp-for=»Rate» class=»form-control» /> , однако с помощью этого метода оно срабатывает только при нажатии кнопки отправки. Есть ли способ заставить его срабатывать, когда я выбираю вкладку из <input asp-for=»RateDisplayOnly» class=»form-control autonumeric-display-only autonumeric-percent» />?

2. Я обновил свой ответ, добавил функцию onblur <input asp-for="RateDisplayOnly"/> , когда элемент потерял фокус, подтвердите $ («#Rate»).

3. Потрясающе! Ваше предложение в приведенном выше комментарии работает, обратите внимание: пример кода, который у вас есть в вашем ответе, этого не делает. Пожалуйста, замените на что-то вроде $(«.autonumeric-display-only»).blur(function () { var str = this.id var getThis = str.substring(0, str.indexOf(«DisplayOnly»)) $(«#» getThis). valid(); }); (я полагаю, внутри готового документа), и я отмечу как ответ. Спасибо за вашу помощь!

4. Ах, но ваш пример работает с вашим кодом, так что все в порядке, отмечаю как ответ, спасибо!