c# - MVC 中的显示与编辑模式

标签 c# asp.net-mvc asp.net-mvc-4 razor

我正在创建一个从用户那里收集数字数据的 MVC 5 网络项目。大多数字段都是可为 null 的小数,我需要将它们显示到不同的小数位,同时在写回数据库时保持完整的精度。

View 模型具有如下属性:

public decimal? TonnesOfFoo { get; set; }
public decimal? TonnesOfBar { get; set; }

View 本身将控件呈现为:

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

这很好用并根据需要显示数据,但是当表单回发时,我将舍入值写回数据库。

如果我的 View 模型中没有“实际”和“显示”属性并使用 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);
     }
});

我不确定上面的内容是否矫枉过正,但如果 Controller 中出现任何验证错误,我需要一种方法以正确的格式呈现数据,否则,未舍入的值将与验证消息一起显示。

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

最佳答案

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

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

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

关于c# - MVC 中的显示与编辑模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23950272/

相关文章:

asp.net-mvc-4 - 使用 WebAPI 搜索

c# - 告诉 Entity Framework 忽略自定义数据库表

c# - 如何在不计算 Enter 键的情况下在 C# 中读取到 EOF?

c# - 生成自动完成框的可能地址列表

asp.net - 通过 WEB API 使用 ASP.NET Identity 进行本地登录

.net - ServiceHost和WebServiceHost有什么区别?

c# - ASP.NET MVC 路由问题中的约束

c# - 如何在 C# 中检查多行文本框中的选定文本?

c# - 方法的条件属性和计算参数

c# - 如何为 Web API 中的所有数据成员将 EmitDefaultValue 全局设置为 false?