Как обрабатывать привязку модели после использования атрибута DisplayFormat - PullRequest
0 голосов
/ 20 ноября 2018

Я работаю над финансовым программным обеспечением, которое использует много валютных значений и процентов.Не думая о юзабилити, если вы создаете TextBox по умолчанию и привязываете его к десятичному значению 0.00M, он представляется пользователю как 0.00.Не ясно, должны ли они вводить 6% как 6,00 или 0,06.Вы также сталкиваетесь с проблемой, когда .065 отображается как 0,06, что делает значение неверным для пользователя.

Чтобы прояснить смысл чисел, я использую атрибуты отображения, такие как:

[Display(Name = "State Tax Rate")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:P2}")]
public decimal StateRate { get; set; }

[Display(Name = "Combined Tax Rate")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:P2}")]
public decimal CombinedRate { get; set; }

[Display(Name = "County Tax Rate")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:P2}")]
public decimal CountyRate { get; set; }

Теперь 6,5% отображается как 6,50%, что лучше с точки зрения удобства использования, но при публикации формы на контроллере ASP.Net Core MVC значения не связываются.Простое удаление знака процента приводит к тому, что он связывается на 650%.Подход, который я использую, состоит в том, чтобы использовать JQuery для очистки данных перед публикацией сообщения:

// deal with percentages:
// 6.5% does not bind, but is displayed to the user.
// 6.5 binds incorrectly (650%)
// .065 is desired format
$(function () {
    $('#my-form').on('submit', function (e) {
        e.preventDefault();                     // avoid default post routine

        // change "6.50%" to 6.5
        var stateRate = parseFloat($('#StateRate').val().replace('%', ''));             
        var combinedRate = parseFloat($('#EstCombinedRate').val().replace('%', ''));
        var countyRate = parseFloat($('#EstCountyRate').val().replace('%', ''));

        // change 6.5 to .065 - leave 0.065 alone.
        if (stateRate > 1) {
            stateRate = stateRate / 100.0;  
        }
        if (combinedRate > 1) {
            combinedRate = combinedRate / 100.0;
        }
        if (countyRate > 1) {
            countyRate = countyRate / 100.0;
        }

        // put the cleaned up values back into the form fields
        $('#StateRate').val(stateRate);     
        $('#CombinedRate').val(combinedRate);
        $('#CountyRate').val(countyRate);

        // make ajax request
        $.post(
            '/MyController/EditTaxRates'
            $(this).serialize(),
            function (data, status, jqXHR) {
                $.notify('Data saved successfully!', { position: "top center" });
            }
        ).fail(function () {
            $.notify('Error saving data.', { position: "top center" });
        });
    });
});

В большинстве случаев это работает правильно, но мне нужно реализовать это во многих местах, иэто добавляет много кода для решения, казалось бы, фундаментальной и простой проблемы.Кроме того, он не подходит для налоговой ставки округа, такой как 0,5%, которая связывает 50% при использовании этого кода в письменном виде.Существуют ли какие-либо встроенные приемы, такие как атрибуты или волшебство Razor, которые приведут к правильному связыванию данных без использования javascript, или есть лучший метод для решения этой проблемы?

...