使用DisplayFormat属性后如何处理模型绑定

时间:2018-11-20 19:49:50

标签: jquery asp.net-core-mvc model-binding usability

我正在开发使用很多货币值和百分比的财务软件。不用考虑可用性,如果创建默认的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的情况下正确绑定,或者是否有解决此问题的最佳实践?

0 个答案:

没有答案