用点替换十进制逗号的数字输入
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 将在用户键入数字时发送数字输入,而忽略规范。
在发布带有类型 '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 将在用户键入数字时发送数字输入,而忽略规范。