我正在创建一个MVC 5 Web项目,该项目收集用户的数字数据。大多数字段都是可以为空的小数,我需要将它们显示到不同的小数位,同时在写回数据库时保持完整的精度。
视图模型具有以下属性:
public decimal? TonnesOfFoo { get; set; }
public decimal? TonnesOfBar { get; set; }
视图本身将控件呈现为:
@Html.TextBoxFor(model => model.TonnesOfFoo, "{0:N1}", new { @class = "form-control" })
@Html.TextBoxFor(model => model.TonnesOfBar, "{0:N3}", new { @class = "form-control" })
这很好用,并根据需要显示数据,但是当回发表单时,我将舍入的值写回数据库。
如果没有"实际"有没有办法解决这个问题。和"显示"我的视图模型中的属性,并使用jQuery同步它们?我可以用某种编辑器模板来处理这种情况吗?
更新
根据M.Ob的建议,我终于设法让这个工作。
我不再使用内联格式,而是使用两个数据属性,一个用于完整精度,另一个用于所需的小数位数。例如 :
@Html.TextBoxFor(model => model.TonnesOfFoo, new { @class = "form-control", data_fullprecision = Model.TonnesOfFoo, data_precision = 1 })
然后在文档就绪时,我循环并使用jQuery Number Plugin:
手动应用格式$('input[data-fullprecision]').each(function () {
var selector = '#' + this.id;
var precision = parseInt($(selector).data('precision'));
var fullprecisionValue = $(selector).data('fullprecision');
if ($.isNumeric(fullprecisionValue)) {
var roundedValue = $.number(fullprecisionValue, precision, '.', '');
$(selector).val(roundedValue);
}
});
我不确定上述内容是否过度,但如果控制器中出现任何验证错误,我需要一种方法以正确的格式显示数据,而不会显示未舍入的值以及验证消息。< / p>
我使用类似的脚本在用户更改值时将值映射到数据属性,最后在提交表单之前将完整的精度数字映射到文本框。
答案 0 :(得分:1)
可能有更优雅的方式,但这里有一个想法:
您可以执行以下操作:将完整精度值存储在文本框的数据属性中。然后,当用户更改文本时,我们JS将data-属性更新为新值。在表单发布后,您可以使用JS函数在提交之前使用数据值更新文本框的值。这样,所有新的(更新的)值和未触动的文本框值都将被正确发布而不是舍入。
@Html.TextBoxFor(model => model.TonnesOfFoo, "{0:N1}", new { @class = "form-control", data_fullprecision = Model.TonnesOfFoo })
答案 1 :(得分:0)
我会使用包含原始值和舍入显示值的视图模型,当持久化回DB时,将原始值与舍入值进行比较,如果值未更改则保持原始值,如果它坚持新的价值。
我认为这是解决这个问题的最简单方法,尽管性能可能不是最好的。
其他解决方案可能是在客户端上使用Knockout,并跟踪哪些值已更改,然后仅保存这些值