Связывание ан-ГБ дат в HTTP GET - PullRequest
8 голосов
/ 22 марта 2012

У меня был кошмар времени с Датами.Мы базировались в Великобритании, поэтому наш формат даты - дд / мм / гггг.Это то, что пользователи будут вводить в форму, когда они хотят определенную дату.У меня есть форма, которая принимает именно такую ​​собственность.Это, очевидно, тип DateTime.Я хочу отправить эту форму контроллеру в GET, чтобы у пользователя был хороший URL-адрес, который он может сохранить, и т. Д. Представление также должно привязать указатель даты JQuery UI к этому элементу.Мне также нужно, чтобы элемент формы имел определенный идентификатор и класс, поэтому мне действительно нужно преобразовать это в форму следующим образом:

@Html.TextBoxFor(model => model.ReturnDate, new { Class = "date", id = "ReturnDate" })

Я указал вариант культуры Великобритании в файле web.config:

<globalization uiCulture="en" culture="en-GB"/>

Тем не менее, как объяснено здесь (http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx)), кажется, что при получении действия контроллера MVC игнорирует вариант культуры и по умолчанию использует США (очевидно, что никто не существует за пределами США, так что это нормальнодля Microsoft, rant over) Прикрепленное не помогает, потому что это означает, что мне придется установить это значение для каждой даты в каждой модели!

Это означает, что если пользователь вводит 01 /05/2012 Я заканчиваю с 05/01/2012, что не так!

Я смотрел на различные решения этой проблемы, но ни одно из них не подходит для меня. Мне нужен способ, чтобы Вседаты отправляются через GET в британском формате . Мы базируемся исключительно в Великобритании, поэтому никакие британские форматы вводиться не будут.

Я не хочу создавать и редактировать, если только оничто я могу сделать это без View / Viewmodelобратился к этому редактору, так как будет неудобно использовать его везде, где есть средство выбора даты.

Вся помощь будет с благодарностью получена!

Ответы [ 2 ]

10 голосов
/ 22 марта 2012

Получил решение, благодаря @Jon за указатели:

public class GBDateModelBinder : IModelBinder
{

    #region IModelBinder Members

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        string dateString = controllerContext.HttpContext.Request.QueryString[bindingContext.ModelName];
        if (string.IsNullOrEmpty(dateString))
                 dateString = controllerContext.HttpContext.Request.Form[bindingContext.ModelName];
        DateTime dt = new DateTime();
        bool success = DateTime.TryParse(dateString, CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out dt);
        if (success)
        {
            return dt;
        }
        else
            {
            return null;
        }
    }

    #endregion
}

, затем зарегистрируйтесь в global.asax:

ModelBinders.Binders.Add(typeof(DateTime), new GBDateModelBinder());

ОБНОВЛЕНИЕ

изменил это, чтобы разрешить ту же проблему при размещении!

2 голосов
/ 10 ноября 2016

В дополнение к ответу Лиама:

Для тех, кто все еще имеет эту проблему (!) И пытается привязать к Nullable DateTime, убедитесь, что вы зарегистрировали правильный тип в global.asax:

ModelBinders.Binders.Add(typeof(DateTime), new GBDateModelBinder());
ModelBinders.Binders.Add(typeof(DateTime?), new GBDateModelBinder());

Если бы я был в тупике на 15 минут!

...