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