我不确定默认模型绑定器 (DefaultModelBinder) 的本地化程度如何,但您可以自己轻松创建一个绑定器,它可以处理特定于文化的数据解析,例如,创建一个新类,我们将其称为 DoubleModelBinder,复制以下内容:
public class DoubleModelBinder : IModelBinder
{
/// <summary>
/// Binds the value to the model.
/// </summary>
/// <param name="controllerContext">The current controller context.</param>
/// <param name="bindingContext">The binding context.</param>
/// <returns>The new model.</returns>
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var culture = GetUserCulture(controllerContext);
string value = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName)
.ConvertTo(typeof(string)) as string;
double result = 0;
double.TryParse(value, NumberStyles.Any, culture, out result);
return result;
}
/// <summary>
/// Gets the culture used for formatting, based on the user's input language.
/// </summary>
/// <param name="context">The controller context.</param>
/// <returns>An instance of <see cref="CultureInfo" />.</returns>
public CultureInfo GetUserCulture(ControllerContext context)
{
var request = context.HttpContext.Request;
if (request.UserLanguages == null || request.UserLanguages.Length == 0)
return CultureInfo.CurrentUICulture;
return new CultureInfo(request.UserLanguages[0]);
}
}
现在,我们在这里所做的是建立我们自己的语言感知双解析器。当我们实现 IModelBinder 接口时,我们需要创建一个 BindModel 方法。这是它的主要内容,但在我们解析任何内容之前,我们需要获取一个基于浏览器语言的 IFormatProvider。因此,我们使用 GetUserCulture 方法来尝试准备浏览器的语言。如果我们不能恢复到当前的文化。
当我们拥有它时,我们就可以解析该值。我们首先从 ValueProvider 中获取它(它实际上是许多值提供者的组合,例如来自 Form 集合、Request 集合等),然后我们使用发现的 IFormatProvider 来解析它,这就是我们现在拥有的 CultureInfo。
完成此操作后,将其添加到模型绑定器集合中非常简单;
ModelBinder.Binders[typeof(Double)] = new DoubleModelBinder();
试试看是否有帮助。