Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC中的显示与编辑模式_C#_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

C# MVC中的显示与编辑模式

C# MVC中的显示与编辑模式,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,我正在创建一个MVC5Web项目,从用户那里收集数字数据。大多数字段都是可为空的小数,我需要将它们显示为不同的小数位数,同时在回写数据库时保持完整的精度 视图模型具有以下属性: public decimal? TonnesOfFoo { get; set; } public decimal? TonnesOfBar { get; set; } 视图本身将控件渲染为: @Html.TextBoxFor(model => model.TonnesOfFoo, "{0:N1}", new {

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

视图模型具有以下属性:

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的建议,我终于成功地使这项工作开始了

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

然后在document ready(文档准备就绪)上,我循环并使用以下命令手动应用格式:

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


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

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

您可以这样做:将您的全部精度值存储在文本框的数据属性中。然后,当用户更改文本时,使用JS将数据属性更新为新值。在表单发布后,您可以让JS函数在提交之前用数据值更新文本框的值。这样,所有新的(更新的)值和未触及的文本框值都将正确地发布在未舍入的文本框上

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

我将使用一个包含原始值和舍入显示值的视图模型,当持久化回DB时,将原始值与舍入值进行比较,如果值未更改,则持久化原始值,如果已持久化新值

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


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

在第一个示例中,当用户键入1.01时会发生什么?它会恢复到1.0吗?或者它会将1.01保存到数据库中?通过显示不同的小数,你是指在单独的只读视图中,还是希望输入也只显示相同数量的小数?Patrick-它会发回1.01,但我会在用户未编辑的任何项目上取消舍入。Stephen-我希望每个项目使用一个文本框。理想情况下,数字将被四舍五入,直到用户点击它,然后完整的值可以显示“数字将被四舍五入,直到用户点击”?如何实现这一点?我在等待响应时尝试了类似的方法,但如果在发布时出现任何验证错误,我需要将所有内容映射回。我现在在想,保存一个“已更改”字段的列表并手动将所有内容映射回模型可能比使用automapper更容易…不确定“需要将所有内容映射回”是什么意思。您的意思是回到原始值还是回到用户输入的值?您是否只需发布、验证,如果无效,则返回带有发布模型的视图?通过这种方式,您可以显示验证错误,并且仍然保留用户输入的值,以便他们知道哪里出错了。不确定automapper是从哪里来的。可能您使用隐藏字段来存储精确值?M.Ob-如果我提交数据并确定ModelState无效,则文本框中仍会显示完整的精确值。我不知道在向用户显示验证消息时如何强制再次对值进行舍入。在向用户显示错误消息时,您是在清除其不正确的值,还是只想对其不正确的值进行舍入?如果您想删除它们的内容,只需重新构建您的模型并返回带有该模型的视图(其中将包含原始值)。如果希望保留它们的值,但只是将它们四舍五入,则应该能够返回带有更新模型(及其数据)的视图,并且textboxfor上的格式将格式化数据。如果不是出于某种原因,则在将错误添加到modelstate之前,始终可以清除modelstate
$('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);
     }
});
@Html.TextBoxFor(model => model.TonnesOfFoo, "{0:N1}", new { @class = "form-control", data_fullprecision = Model.TonnesOfFoo })