Привязка модели к пользовательским типам с различной локализацией - PullRequest
0 голосов
/ 12 июля 2011

У меня есть пользовательское связывание массива объектов в IEnumerable заказов в действии контроллера

HTML:

<input class='textBox' name='bookings[0].Date' type='text' value='01/01/2001' />
<select name='bookings[0].StartTime' class='startTime'>
  <option value="7">7:00</option>
  <option value="7.5">7:30</option>
  <option value="8">8:00</option>
  <option value="8.5">8:30</option> 
</select>
<select name='bookings[0].EndTime' class='endTime'>
  <option value="7">7:00</option>
  <option value="7.5">7:30</option>
  <option value="8">8:00</option>
  <option value="8.5">8:30</option> 
</select>
....
<input class='textBox' name='bookings[5].Date' type='text' value='01/01/2001' />
<select name='bookings[5].StartTime' class='startTime'>
<select name='bookings[5].EndTime' class='endTime'>

Действие контроллера:

public ActionResult CreateEvent(IEnumerable<BookingDetails> bookings)
{
  ....
}

И контейнер класса для привязки

public class BookingDetails
{
    public string Date { get; set; }
    public float StartTime { get; set; }
    public float EndTime { get; set; }
}

Коллекция "bookings" параметра действия контроллера абсолютно правильно содержит данные, если культура страницы - en-US, но если это "fr-FR", плавающие значения для времени равны 0 например:

- Дата: 01.01.2001 - Время начала: 0 - EndTime: 10 - Дата: 01.01.2001 - Время начала: 11 - Время окончания: 0

, где 0 - десятичное значение: 8,5 или 12,5, например. У меня не может быть значений с запятой и точкой для разных культур из-за сложного расчета JavaScript на странице, который поддерживает только период для плавающих чисел.

Кто-нибудь знает обходной путь для отправки данных на контроллер с «инвариантным» типом культуры? Спасибо

1 Ответ

1 голос
/ 12 июля 2011

вы можете создать пользовательский связыватель модели только для значений с плавающей точкой, например

public class DecimalModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext,
            ModelBindingContext bindingContext)
        {
            ValueProviderResult valueResult = bindingContext.ValueProvider
                .GetValue(bindingContext.ModelName);
            ModelState modelState = new ModelState { Value = valueResult };
            object actualValue = null;
            try
            {
                actualValue = Convert.ToDecimal(valueResult.AttemptedValue,
                    CultureInfo.InvariantCulture);
            }
            catch (FormatException e)
            {
                modelState.Errors.Add(e);
            }

            bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
            return actualValue;
        }
    }

и затем вы можете зарегистрировать его в global.asax в Application_Start

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());

Для примера кода и подробного объяснения смотрите сообщение Фила Хака . Я только что изменил Культуру на инвариантную культуру при вызове Convert.ToDecimal

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...