Формат 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 55

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