Я не уверен, насколько далеко заходит локализация с привязкой модели по умолчанию (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();
Попробуйте и посмотрите, поможет ли это.
person
Matthew Abbott
schedule
04.07.2010