用点替换十进制逗号的数字输入

Number input replacing decimal comma with dot

在发布带有类型 'number' 和值“1,5”的输入的表单后,浏览器(Chrome 43.0.2357.130,FF 38.0.5)正在发送带有点作为小数点分隔符,但输入具有属性 lang="cs"(在捷克共和国,我们使用十进制逗号),因此对于 ASP.NET MVC,这是不正确的格式。

如何设置浏览器 (form/input) 以发送用户真正填写的内容(在我的例子中是“1,5”)?

浏览器发送的表单数据:

__RequestVerificationToken:KJG1yJxm-1EcUHPwgvr0gPpkyoEHHHcTfSu6hHvaKDA_XKHTzWfPfUJtAr11gNiR_euG_jWYmXlrMO7dyhSf7g4K74eOVTtEzLQ1OdrTLZ_cbIyyYj5vrgxlk81JzuhM0
PaymentMethodId:8
PaymentMethod:Direct payment
Provider:Direct payment
MinAmount:1,00000000
MaxAmount:5000,00000000
Amount:1.5

Oukey,看来我找到了解决方法,但请将其作为示例查看如何处理类似问题...

public class ApolloModelBinder : DefaultModelBinder
{
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
    {
        var request = controllerContext.HttpContext.Request;

        decimal i;
        var value = request.Form[propertyDescriptor.Name];
        if (propertyDescriptor.PropertyType == typeof(decimal) && decimal.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out i))
        {
            propertyDescriptor.SetValue(bindingContext.Model, i);
            return;
        }

        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
    }
}

支持 <input type="number"> 的浏览器将始终发送 . 作为小数点分隔符。您无法更改此设置,因为这是 <input type="number"> 的 HTML5 规格。 lang 属性与发送到服务器的数据无关:浏览器必须始终使用 .。但是,lang 属性可用于显示目的。

但是,不支持 <input type="number"> 的浏览器将发送您输入的数字(例如,,)。

恕我直言,这是非常有问题的(并且非常以英语为中心),因为服务器不知道浏览器是否支持 <input type="number"> 或不支持,这使得解析很容易出错(“1.000”是一千还是一? ).

控制发送内容的唯一方法是使用 <input type="text">。如果您想要旋转器功能,则需要使用自定义 JavaScript 库,例如 jQuery UI.

这也是为什么 ASP.NET MVC Editor(For) 将默认使用 <input type="text"> 来处理像 decimal 这样的类型,而不是 <input type="number"> .

另见 http://www.w3.org/TR/2014/REC-html5-20141028/forms.html#input-author-notes

请注意,Internet Explorer 将在用户键入数字时发送数字输入,而忽略规范。