MVC中的显示与编辑模式

本文关键字:编辑 模式 显示 MVC | 更新日期: 2023-09-27 18:05:57

我正在创建一个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" })

这工作得很好,并根据需要呈现数据,但是当表单被张贴回来时,我正在将舍入值写回数据库。

在我的视图模型中没有"实际"answers"显示"属性并使用jQuery同步它们的情况下,是否有任何方法可以解决这个问题?是否有某种编辑器模板,我可以使用来处理这种情况?

根据M.Ob的建议,我终于设法使它工作了。

我不再使用内联格式,而是使用两个数据属性,一个用于完全精度,另一个用于所需的小数位数。例如:

@Html.TextBoxFor(model => model.TonnesOfFoo, new { @class = "form-control", data_fullprecision = Model.TonnesOfFoo, data_precision = 1 })

然后在文档准备就绪时,我循环并使用jQuery数字插件手动应用格式化:

$('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);
     }
});

我不确定以上是否过分,但我需要一种方法,如果在控制器中发生任何验证错误,则以正确的格式显示数据,否则未四舍五入的值将与验证消息一起显示。

我使用类似的脚本在用户更改值时将值映射到数据属性,最后在提交表单之前将全精度数字映射到文本框。

MVC中的显示与编辑模式

可能有更优雅的方式,但这里有一个想法:

您可以这样做:将完整的精度值存储在文本框的data-属性中。然后,当用户更改文本时,JS将data-属性更新为新值。在表单发布之后,您可以让JS函数在提交发生之前用数据值更新文本框的值。这样,所有新的(更新的)值和未修改的文本框值将被正确地贴在未四舍五入的位置。

@Html.TextBoxFor(model => model.TonnesOfFoo, "{0:N1}", new { @class = "form-control", data_fullprecision = Model.TonnesOfFoo })

我将使用包含原始值和四舍五入显示值的视图模型,当持久化回DB时,将原始值与四舍五入值进行比较,如果值没有改变,则持久化原始值,如果它已持久化新值。

我认为这是解决这个问题最简单的方法,尽管性能可能不是最好的。

其他解决方案可能是查看在客户机上使用Knockout,并跟踪哪些值已更改,然后仅保存这些值