ASP.NET MVC3: заставить контроллер использовать формат даты дд / мм / гггг
По сути, мой 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
, Необязательный параметр должен быть ссылочным типом, обнуляемым типом или быть объявлен как необязательный параметр."
6 ответов
Прочитайте это. Это дает хорошее объяснение того, что происходит и почему это работает так, как работает.
Я нахожусь в ситуации, когда я знаю, что все, кто использует сайт, находятся в Великобритании, поэтому я могу смело отменять настройки по умолчанию. 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;
}
}
}
Вам нужно использовать собственный ModelBinder для вашего DateTime. У меня была та же проблема, что и у вас.
Вы пытались установить текущую культуру как 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;
}
Ты можешь это сделать:
глобально (в global.asax под Application_Start()):
ModelBinders.Binders.Add(typeof(DateTime), new DateTimeModelBinder());
для метода:
public ActionResult TimeTable([Binder(typeof(DateTimeModelBinder)]DateTime ViewDate)
для пользовательского класса модели - нет, нет возможности, потому что вы используете struct DateTime;-)
Ах, извините, я не смог добавить комментарий к посту Адамса - он основан на его коде.
В основном мой DatePicker использует британский формат дд / мм / гггг
Ошибка новичка. Он должен использовать любой формат, установленный браузером. Проблема не в формате, а в разных форматах между клиентом и сервером. Сервер должен выдать код, который форматирует дату в соответствии с согласованной локалью, которую сервер затем также использует для ее анализа.
Но когда я отправляю форму, ASP.NET явно использует американский формат.
Нету. Это говорит о том, что когда я принимаю специю, это всегда соль, а потом ты всегда принимаешь соль. Ваш сервер принимает текущую согласованную культуру, которая - если вы не изменяете настройки - согласовывается между клиентом и сервером. Проверьте текущую культуру потоков, когда она должна выполнить синтаксический анализ, чтобы увидеть, для чего она установлена.
Из моего 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;
}
}
Он использует точный синтаксический анализ, поэтому у вас не должно быть никаких проблем с проанализированными датами.