Asp.net mvc 4 Can';t将货币格式的文本框转换为十进制模型(MVC)

Asp.net mvc 4 Can';t将货币格式的文本框转换为十进制模型(MVC),asp.net-mvc-4,razor,model-binding,Asp.net Mvc 4,Razor,Model Binding,在我的应用程序中,我有一个文本框,其中包含将值转换为货币格式的javascript。这是强制性的,不可协商 即5.50美元变成5.50美元,-5.50美元变成5.50美元 当我尝试保存时,会出现验证错误,因为$5.50对于ViewModel无效 //View file @Html.CustomEditorFor(m => m.CurrentTotal, "currency") //Controller file. First thing in the controller method

在我的应用程序中,我有一个文本框,其中包含将值转换为货币格式的javascript。这是强制性的,不可协商

即5.50美元变成5.50美元,-5.50美元变成5.50美元

当我尝试保存时,会出现验证错误,因为$5.50对于ViewModel无效

//View file
 @Html.CustomEditorFor(m => m.CurrentTotal, "currency")

//Controller file. First thing in the controller method called
if (ModelState.IsValid)
{
//... not getting to this
}

//ViewModel file
[Display(Name = "Current Total:")]
public decimal CurrentTotal
{
  get
  {
    return PropertyDictionary.GetDecimal("CurrentTotal", 0).Value;
  }
  set
  {
    PropertyDictionary.SetDecimal("CurrentTotal", value);
  }
}
我想知道如何在文本框转到模型并导致ModelState无效之前将非数字排除“.”从文本框中删除


我再次继承了这个应用程序,并且正在学习,所以我感谢您的时间和耐心

打个电话,比如

double.Parse(currencyValue, NumberStyles.Currency);

正如本文所建议的那样。查看其他选项。

我仍然不知道如何在MVC中实现这一点(尽管看起来我应该使用自定义模型绑定器),但我已经解决了这个问题

 $(document).submit(function () {
        $("input[type=text].currency").each
        (
            function () {
                $(this).val($(this).val().toString().replace('(', '-').replace("$", '').replace(")", ''));
            }
        );
    });

希望这对未来有帮助。

你格式化的数字不再是一个数字,它是一个字符串…你应该考虑至少在客户端处理这两个不同的数据点。将十进制单独作为隐藏控件,将javascript转换为其他可见控件,然后使用javascript将其转换回十进制(结果在隐藏控件中),然后回发。有道理吗?有点。我正在考虑在发回之前转换它的JavaScript路径,这不会干扰用户,我相信这是可以接受的,但我想知道MVC通常是如何做到这一点的。我觉得这是很常见的,尤其是因为您可以在ViewModel文件中按照[DisplayFormat(ApplyFormatInEditMode=true,DataFormatString=“{0:c}”)]的思路来做一些事情,从而导致各种各样的匹配。解析将不起作用,因为它在转换之前已绑定到模型。我之前在ViewModel文件中做过这项工作,但它不起作用。