Связыватель модели ASP.NET MVC с глобальными числовыми форматами

Связыватель модели по умолчанию возвращает ошибки для свойств типа 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;
   }
}
9
задан Nick Reeve 21 February 2011 в 10:25
поделиться