【问题标题】:ASP.Net MVC Decimal Custom Editor Template - Data Not SavingASP.Net MVC 十进制自定义编辑器模板 - 数据未保存
【发布时间】:2012-03-19 12:02:44
【问题描述】:

我的模型中有以下字段:

public Decimal AnnualSalary { get; set; }

在我看来显示为:

@Html.EditorFor(model => model.SelectedPerson.AnnualSalary)

这给了我一个小数点后 2 位的数据格式。我还想要一个逗号千位分隔符。所以我在 Shared | 中创建了一个名为 Decimal.cshtml 的文件。 Editor Templates 文件夹包含以下内容:

@model Decimal
@Html.TextBox("", Model.ToString("#,##0.00"))

这为我提供了我想要在编辑器中显示现有数据的内容。但是,当我去保存修改后的数据时,它失败了。如果我删除十进制编辑器模板,那么数据保存得很好。

我还注意到,如果没有新的编辑器模板,如果我在此文本框中输入逗号,我不会收到客户端验证错误,但是我的数据仍然没有保存。

好像客户端验证很乐意接受千位分隔符,但是当 EF 代码第一次尝试保存数据时,服务器端的某些东西不喜欢千位分隔符。

这似乎是一个相当普遍的要求,但我很难在任何地方找到明确的答案。

【问题讨论】:

    标签: asp.net-mvc ef-code-first decimal mvc-editor-templates


    【解决方案1】:

    我建议您创建一个 SelectedPersonViewModel,其中 AnnualSalary 是一个字符串,并将 RegexAttribute 放在其上方,并使用正确的正则表达式进行验证。

    您还可以在内部解析提供的字符串并将其保存到十进制变量中,然后返回到您的模型(在发布后的操作中)

    编辑:可能类似于此问题的答案中所述:Decimal values with thousand separator in Asp.Net MVC

    【讨论】:

    • 为什么要更改字符串中的 AnnualSalary 并在操作中解析它而不是保留为小数...验证仍然有效,并且不需要将小数解析为字符串...。?
    • 它将允许您以您接受的任何形式(正则表达式)将其发送到服务器,并且还将摆脱现有问题。
    • 感谢您在编辑中提供链接。这使我从 Phil Haack 那里找到了一个通用的解决方案,如下面的回答中所述。我无法真正将您的答案标记为正确,但我已投赞成票。
    【解决方案2】:

    模型期望十进制值有效,EF 也是如此。 您可以在隐藏字段中添加十进制值,然后显示一个带有逗号格式的年薪值的文本框。 然后使用 jquery,您可以在文本框更新时绑定隐藏字段的值。 这样,您将传递模型所期望的十进制值。

    【讨论】:

    • 或者如上一个答案所说,在viewmodel中用逗号传递工资,然后在服务器端进行转换。
    【解决方案3】:

    感谢上面 Michal B 提供的链接,我最终找到了指向 this solution provided by Phil Haack 的链接。

    我尝试了我关注的链接中提到的许多其他解决方案,但这是迄今为止我发现的最全面和最通用的解决方案。

    【讨论】:

      猜你喜欢
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多