在使用“数字”类型和值“1,5”的输入发布表单后,浏览器(Chrome 43.0.2357.130,FF 38.0.5)正在发送带点作为小数点分隔符的数字,但输入具有属性lang =“cs”(在捷克共和国我们使用十进制逗号),因此对于ASP.NET MVC,它的格式不正确。
如何设置浏览器(表单/输入)以发送用户真正填写的内容(在我的情况下为“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
答案 0 :(得分:2)
支持<input type="number">
的浏览器将始终发送.
作为小数点分隔符。您无法更改此内容,因为这符合<input type="number">
的HTML5规范。 lang
属性与发送到服务器的数据无关:浏览器必须始终使用.
。但是,lang
属性可用于显示目的。
但是,不支持<input type="number">
的浏览器会在您键入数字时发送该号码(例如,
)。
恕我直言,这是非常有问题的(并且非常具有角度中心性),因为服务器不知道浏览器是否支持<input type="number">
,使得解析非常容易出错(是&#34; 1.000&#34;一个一千或一个?)。
您可以使用<input type="text">
控制发送内容的唯一方法。如果你想要微调器功能,你需要使用自定义JavaScript库,比如jQuery UI。
这也是为什么ASP.NET MVC编辑器(For)默认会对{strong>十进制而不是<input type="text">
等类型使用<input type="number">
。
另见http://www.w3.org/TR/2014/REC-html5-20141028/forms.html#input-author-notes。
请注意,Internet Explorer会在用户输入数字输入时发送数字输入,忽略规范。
答案 1 :(得分:0)
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);
}
}