Подтвердить что ты не робот

ASP.NET MVC3: заставить контроллер использовать формат даты dd/mm/yyyy

В принципе, мой datepicker использует формат Великобритании dd/mm/yyyy. Но когда я отправляю форму, ASP.net явно использует формат США. (будет принимать только дни, если менее 12, т.е. думает, что это месяц.)

 public ActionResult TimeTable(DateTime ViewDate)

Есть ли способ заставить его распознать определенный способ?

Странно, хотя другие методы вставки, похоже, распознают правильный формат.

"Словарь параметров содержит нулевую запись для параметра ViewDate непустого типа System.DateTime для метода System.Web.Mvc.ActionResult Index(System.DateTime) в Mysite.Controllers.RoomBookingsController. Необязательный параметр должен быть ссылочным типом, нулевым типом или объявлен как необязательный параметр.

4b9b3361

Ответ 1

Прочитайте этот. Это дает хорошее объяснение того, что происходит и почему оно работает так, как оно.

Я в ситуации, когда знаю, что все, кто использует сайт, находятся в Великобритании, поэтому я могу смело переопределить стандартное связующее устройство DateTime:

public class DateTimeModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var date = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;

        if (String.IsNullOrEmpty(date))
            return null;

        bindingContext.ModelState.SetModelValue(bindingContext.ModelName, bindingContext.ValueProvider.GetValue(bindingContext.ModelName));
        try
        {
            return DateTime.Parse(date);
        }
        catch (Exception)
        {
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format("\"{0}\" is invalid.", bindingContext.ModelName));
            return null;
        }
    }
}

Ответ 2

Вам нужно использовать пользовательский ModelBinder для вашего DateTime. У меня была та же проблема, что и вы.

Ответ 3

Вы пытались установить текущую культуру как en-GB?

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

     CultureInfo cultureInfo = CultureInfo.GetCultureInfo("en-GB");

     Thread.CurrentThread.CurrentCulture = cultureInfo;
     Thread.CurrentThread.CurrentUICulture = cultureInfo;                    
 }

Ответ 4

В принципе, мой датпикер использует формат Великобритании dd/mm/yyyy

Ошибка начинающего. Он должен использовать любой формат, на который установлен браузер. Проблема заключается не в формате, а в разных форматах между клиентом и сервером. Сервер должен испускать код, который форматирует дату в соответствии с согласованной локалью, которую сервер также использует для ее анализа.

Но когда я отправляю форму, ASP.NET явно использует формат США.

Неа. Это говорит о том, что когда я принимаю пряность, это всегда соль, и тогда вы всегда принимаете соль. Ваш сервер принимает текущую согласованную культуру, которая - если вы не изменяете настройки - согласовывается между клиентом и сервером. Проверьте текущую культуру потоков, когда он должен выполнить синтаксический анализ, чтобы увидеть, для чего он установлен.

Ответ 5

Вы можете сделать это:

  • глобально (в global.asax в разделе Application_Start()):

    ModelBinders.Binders.Add(typeof(DateTime), new DateTimeModelBinder()); 
    
  • для метода:

        public ActionResult TimeTable([Binder(typeof(DateTimeModelBinder)]DateTime ViewDate)
    
  • для настраиваемого класса модели - ah no, no posibility, потому что вы используете struct DateTime; -)

А, извините, я не смог добавить комментарий к сообщению Adams - он основывался на его коде.

Ответ 6

Из моего BindigTools для привязки DateTime? (Nullable), основанный на некотором образце книги - Pro MVC3

    public static DateTime? GetValueNDateTime(ModelBindingContext context, string searchPrefix, string key, string format)
    {
        ValueProviderResult vpr = context.ValueProvider.GetValue(searchPrefix + key);
        DateTime outVal;
        if (DateTime.TryParseExact(vpr.AttemptedValue, format, null, System.Globalization.DateTimeStyles.None, out outVal))
        {
            return outVal;
        }
        else
        {
            return null;
        }
    }

Он использует синтаксический анализ точно, поэтому у вас не должно быть проблем с разобранными датами.