ASP.NET MVC3 - формат даты и времени - PullRequest
28 голосов
/ 20 октября 2011

Я использую ASP.NET MVC 3.
Моя ViewModel выглядит так:

public class Foo
{
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
    public DateTime StartDate { get; set; }
    ...
}

По-моему, у меня есть что-то вроде этого:

<div class="editor-field">
    @Html.EditorFor(model => model.StartDate)
    <br />
    @Html.ValidationMessageFor(model => model.StartDate)
</div>

StartDate отображается в правильном формате, но когда я изменяю его значение на 19.11.2011 и отправляю форму, я получаю следующее сообщение об ошибке: «Значение '19 .11.2011' недопустимо для StartDate."

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

42 голосов
/ 20 октября 2011

Вам необходимо установить правильную культуру в элементе глобализации вашего файла web.config, для которого dd.MM.yyyy является допустимым форматом даты и времени:

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

Например, это формат по умолчанию на немецком языке: de-DE.


UPDATE:

В соответствии с вашим требованием в разделе комментариев вы хотите сохранить англо-американскую культуру приложения, но при этом использовать разные форматы для дат. Это может быть достигнуто написанием пользовательского связывателя модели:

using System.Web.Mvc;
public class MyDateTimeModelBinder : DefaultModelBinder
{
    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.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, 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);
    }
}

который вы зарегистрируете в Application_Start:

ModelBinders.Binders.Add(typeof(DateTime), new MyDateTimeModelBinder());
10 голосов
/ 21 июня 2012

Исходя из вашего комментария, я вижу все, что вы хотите, это английский ток, но с другим форматом даты (поправьте меня, если я ошибаюсь).

Дело в том, что DefaultModelBinder использует настройки культурысервер для данных формы.Так что я могу сказать, что сервер использует культуру «en-US», но с другим форматом даты.

Вы можете сделать что-то подобное в Application_BeginRequest, и все готово!

protected void Application_BeginRequest()
{
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;
}

Web.Config

<globalization culture="en-US" />
0 голосов
/ 21 октября 2014

Добавил этот код ниже в global.asax.cs file

protected void Application_BeginRequest()  
{        
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());     
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;     
}

И добавил ниже в web.config под <system.web>

<globalization culture="en-US">;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...