当我的应用程序在对小数使用不同数字格式(例如 1.2 = 1,2)的国家/地区使用时,默认模型绑定器返回类型为 double 的属性的错误。网站的文化在我的 BaseController 中有条件地设置。
我已尝试添加自定义模型绑定器并覆盖 bindModel 函数,但我看不到如何解决其中的错误,因为 Culture 已被设置回默认的 en-GB。
所以我尝试向我的 BaseController 添加一个动作过滤器,在那里设置文化,但不幸的是 bindModel 似乎在我的动作过滤器之前被触发了。
我怎样才能解决这个问题?通过让 Culture 不重置自身或在 bindModel 启动之前将其设置回来?
模型无效的控制器:
public ActionResult Save(MyModel myModel)
{
if (ModelState.IsValid)
{
// Save my model
}
else
{
// Raise error
}
}
过滤设置文化的地方:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
CultureInfo culture = createCulture(filterContext);
if (culture != null)
{
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
base.OnActionExecuting(filterContext);
}
自定义模型绑定器:
public class InternationalDoubleModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (valueResult != null)
{
if (bindingContext.ModelType == typeof(double) || bindingContext.ModelType == typeof(Nullable<double>))
{
double doubleAttempt;
doubleAttempt = Convert.ToDouble(valueResult.AttemptedValue);
return doubleAttempt;
}
}
return null;
}
}