Формат datetime in asp.net mvc 4
как я могу заставить формат datetime в asp.net mvc 4 ? В режиме отображения он показывает, как я хочу, но в модели редактирования это не так. Я использую displayfor и editorfor и applyformatineditmode=true с dataformatstring= " {0:dd / MM/yyyy}" Что я пробовал:
- глобализация в интернете.config (оба из них) с моей культурой и uiculture.
- изменение культуры и uiculture в application_start ()
- пользовательский modelbinder для datetime
Я понятия не имею, как заставить его, и мне нужно ввести дату как dd/MM/yyyy не по умолчанию.
ПОДРОБНЕЕ: мой viewmodel выглядит так
[DisplayName("date of birth")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? Birth { get; set; }
в виду я использую @Html.DisplayFor(m=>m.Birth)
но это работает, как ожидалось (я вижу форматирование)
и для ввода даты я использую @Html.EditorFor(m=>m.Birth)
но если я попытаюсь ввести что-то вроде 13/12/2000 не удается с ошибкой, что это не действительная дата (12/13/2000 и 2000/12/13 работают, как ожидалось, но мне нужно ДД/ММ/гггг).
пользовательский modelbinder вызывается в application_start () b/c я не знаю, где еще.
используя <globalization/>
Я пробовал с culture="ro-RO", uiCulture="ro"
и другие культуры, которые дали бы мне dd/MM/yyyy.
Я также попытался установить его на основе каждого потока в application_start () (здесь есть много примеров, как это сделать)
для всех, кто будет читать этот вопрос: Похоже, что ответ Дарина Димитрова будет работать до тех пор, пока у меня нет клиента утверждение. Другой подход заключается в использовании пользовательской проверки, включая проверку на стороне клиента. Я рад, что узнал об этом, прежде чем воссоздать все приложение.
3 ответа:
Ааааа, теперь понятно. Кажется, у вас есть проблемы с привязкой значения. Не с отображением его на вид. Действительно, это ошибка связующего по умолчанию модели. Вы можете написать и использовать пользовательский, который будет учитывать
[DisplayFormat]
атрибут на вашей модели. Я проиллюстрировал такую пользовательскую модель связующего здесь:https://stackoverflow.com/a/7836093/29407
видимо, некоторые проблемы все еще сохраняются. Вот моя полная настройка работы отлично подходит для обоих ASP.NET MVC 3 & 4 RC.
модель:
public class MyViewModel { [DisplayName("date of birth")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime? Birth { get; set; } }
Спасибо Дарин, Для меня, чтобы иметь возможность отправлять сообщения в метод create, он работал только после того, как я изменил код BindModel :
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var displayFormat = bindingContext.ModelMetadata.DisplayFormatString; var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (!string.IsNullOrEmpty(displayFormat) && value != null) { DateTime date; displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty); // use the format specified in the DisplayFormat attribute to parse the date if (DateTime.TryParse(value.AttemptedValue, CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out date)) { return date; } else { bindingContext.ModelState.AddModelError( bindingContext.ModelName, string.Format("{0} is an invalid date format", value.AttemptedValue) ); } } return base.BindModel(controllerContext, bindingContext); }
надеюсь, что это может помочь кому-то еще...
проблемы проверки клиента могут возникнуть из-за ошибки MVC (даже в MVC 5) в jquery.утверждать.ненавязчивый.минута.js, который не принимает формат даты и времени в любом случае. К сожалению, вы должны решить ее вручную.
мое, наконец, рабочее решение:
$(function () { $.validator.methods.date = function (value, element) { return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid(); } });
вы должны включить раньше:
@Scripts.Render("~/Scripts/jquery-3.1.1.js") @Scripts.Render("~/Scripts/jquery.validate.min.js") @Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js") @Scripts.Render("~/Scripts/moment.js")
вы можете установить время.js с помощью:
Install-Package Moment.js