[Asp.net-Mvc] Связывание MVC DateTime с неправильным форматом даты



Answers

Я бы глобально установил ваши культуры. ModelBinder забрать это!

  <system.web>
    <globalization uiCulture="en-AU" culture="en-AU" />

Или просто измените это для этой страницы.
Но во всем мире в web.config я думаю, что лучше

Question

Теперь Asp.net-MVC допускает неявное связывание объектов DateTime. У меня есть действие в соответствии с

public ActionResult DoSomething(DateTime startDate) 
{ 
... 
}

Это успешно преобразует строку из ajax-вызова в DateTime. Однако мы используем формат даты dd / MM / yyyy; MVC преобразуется в MM / dd / yyyy. Например, при отправке вызова в действие со строкой '09 / 02/2009 'в DateTime из '02 / 09/2009 00:00:00' или 2 сентября в наших локальных настройках.

Я не хочу откатывать свое собственное связующее устройство для формата даты. Но, кажется, нет необходимости менять действие, чтобы принять строку, а затем использовать DateTime.Parse, если MVC способен сделать это для меня.

Есть ли способ изменить формат даты, используемый в привязке модели по умолчанию для DateTime? Не следует ли в любом случае использовать привязку к модели по умолчанию?




  public class DateTimeFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.RequestType == "GET")
        {

            foreach (var parameter in filterContext.ActionParameters)
            {
                var properties = parameter.Value.GetType().GetProperties();

                foreach (var property in properties)
                {
                    Type type = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;

                    if (property.PropertyType == typeof(System.DateTime) || property.PropertyType == typeof(DateTime?))
                    {
                        DateTime dateTime;

                        if (DateTime.TryParse(filterContext.HttpContext.Request.QueryString[property.Name], CultureInfo.CurrentUICulture, DateTimeStyles.None, out dateTime))
                            property.SetValue(parameter.Value, dateTime,null);
                    }
                }

            }
        }
    }
}



Я установил ниже конфигурацию на мой MVC4, и он работает как шарм

<globalization uiCulture="auto" culture="auto" />



Это будет немного отличаться в MVC 3.

Предположим, что у нас есть контроллер и представление с методом Get

public ActionResult DoSomething(DateTime dateTime)
{
    return View();
}

Мы должны добавить ModelBinder

public class DateTimeBinder : IModelBinder
{
    #region IModelBinder Members
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        DateTime dateTime;
        if (DateTime.TryParse(controllerContext.HttpContext.Request.QueryString["dateTime"], CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out dateTime))
            return dateTime;
        //else
        return new DateTime();//or another appropriate default ;
    }
    #endregion
}

и команда в Application_Start () Global.asax

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



Я установил CurrentCulture и CurrentUICulture своим настраиваемым базовым контроллером

    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);

        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-GB");
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-GB");
    }





Links