Связыватель модели по умолчанию возвращает ошибки для свойств типа double, когда мое приложение используется в странах, которые используют другое форматирование чисел для десятичных дробей (например, 1,2 = 1,2). Культура сайта устанавливается в моем BaseController условно.
Я пробовал добавить привязку пользовательской модели и переопределить функцию bindModel, но я могу ' Я не вижу, как там обойти ошибку, поскольку для Культуры уже установлено значение по умолчанию en-GB.
Итак, я попытался добавить фильтр действий к моему BaseController, который задает Культуру там, но, к сожалению, bindModel, похоже, получает сработал перед моим фильтром действий.
Как я могу обойти это? Либо заставив культуру не сбрасывать себя, либо сбросив ее до того, как сработает 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;
}
}