ASP.NET MVC 5应用程序中的十进制数

本文关键字:十进制数 应用程序 NET MVC ASP | 更新日期: 2023-09-27 18:21:52

我对十进制数字有问题。

如果我使用。(dot)而不是文本框中的(逗号),它在控制器中为null。

我知道这是一个语言问题,因为在西班牙语中,小数用逗号代替句点,但我需要用句点。

有可能改变这一点吗?

这很奇怪,因为在控制器中我必须使用。(点)表示小数,即:

我可以做float x = 3.14,但我不能做float x = 3,14,所以我不理解。。。在某些情况下,我不得不使用点。。。在其他情况下,我必须使用逗号。。。

这是我的代码:

在模型中:

[Display(Name = "Total")]
public double Total { get; set; }

视图:

@Html.EditorFor(model => model.Total, new { id = "Total", htmlAttributes = new {@class = "form-control" } })

在控制器中:

public ActionResult Create([Bind(Include = "ID,Codigo,Fecha,Trabajo,Notas,BaseImponible,Iva,Total,Verificado,FormaDePagoID,ClienteID")] Presupuesto presupuesto)
    {

ASP.NET MVC 5应用程序中的十进制数

谢谢大家。我从Phil Haack那里找到了这个代码,它运行得很好。

在项目的任何文件夹中创建一个类

public class ModelBinder
{
    public class DecimalModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext,
                                         ModelBindingContext bindingContext)
        {
            object result = null;
            // Don't do this here!
            // It might do bindingContext.ModelState.AddModelError
            // and there is no RemoveModelError!
            // 
            // result = base.BindModel(controllerContext, bindingContext);
            string modelName = bindingContext.ModelName;
            string attemptedValue =
                bindingContext.ValueProvider.GetValue(modelName).AttemptedValue;
            // Depending on CultureInfo, the NumberDecimalSeparator can be "," or "."
            // Both "." and "," should be accepted, but aren't.
            string wantedSeperator = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;
            string alternateSeperator = (wantedSeperator == "," ? "." : ",");
            if (attemptedValue.IndexOf(wantedSeperator) == -1
                && attemptedValue.IndexOf(alternateSeperator) != -1)
            {
                attemptedValue =
                    attemptedValue.Replace(alternateSeperator, wantedSeperator);
            }
            try
            {
                if (bindingContext.ModelMetadata.IsNullableValueType
                    && string.IsNullOrWhiteSpace(attemptedValue))
                {
                    return null;
                }
                result = decimal.Parse(attemptedValue, NumberStyles.Any);
            }
            catch (FormatException e)
            {
                bindingContext.ModelState.AddModelError(modelName, e);
            }
            return result;
        }
    }
}

将其添加到Global.asax 中的Application_Start()方法中

    ModelBinders.Binders.Add(typeof(decimal), new ModelBinder.DecimalModelBinder());
    ModelBinders.Binders.Add(typeof(decimal?), new ModelBinder.DecimalModelBinder());

现在使用十进制而不是浮点或双精度,一切都会好起来的!!谢谢队友们,再见!。

您的控制器使用C#。特定语言声明.是十进制分隔符。时期这不是特定语言,仅此而已。

您的数据库或用户界面(使用服务器的语言设置)可能使用其他十进制分隔符,而不是默认(美国)语言设置C#使用的分隔符。这就是为什么必须使用,作为分隔符的原因。

您需要使用自定义模型绑定器。

查看此博客文章http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx/

如果您希望根据UI区域性在UI中以逗号(,)分隔的十进制输入转换为句点(.)以绑定到C#十进制数,您可以使用Asp.NetMVC的自定义模型绑定器,其中使用逗号分隔的十进制字符串并将逗号替换为句点,然后分配给C#十进制属性。

其优点是,它可以在整个应用程序中重复使用,在应用程序中可能会出现小数转换的重复场景。

希望以下链接可以帮助你:

ASP.Net MVC自定义模型绑定说明http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspxhttp://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx/