Изменить формат даты в приложении ASP.NET MVC

Мне нужно изменить формат даты, чтобы быть dd.MM.yyyy, Я получаю ошибку проверки на стороне клиента, потому что формат даты ASP.NET MVC отличается от того, что я ожидаю на сервере.

Чтобы изменить формат даты ASP.NET MVC, я попытался:

Web.config:

<globalization uiCulture="ru-RU" culture="ru-RU" />

Модель:

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

Шаблон редактора:

@model DateTime?
@Html.TextBox(string.Empty, (Model.HasValue 
    ? Model.Value.ToString("dd.MM.yyyy")
    : string.Empty), new { @class = "date" })

Посмотреть:

@Html.EditorFor(m => m.ServiceCreatedFrom, new { @class = "date" })

Даже Global.asax:

public MvcApplication()
{
    BeginRequest += (sender, args) =>
        {
            var culture = new System.Globalization.CultureInfo("ru");
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;
        };
}

У меня ничего не получалось.

4 ответа

Решение

Следующее должно работать:

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

и в шаблоне вашего редактора:

@model DateTime?
@Html.TextBox(
    string.Empty, 
    ViewData.TemplateInfo.FormattedModelValue, 
    new { @class = "date" }
)

а потом:

@Html.EditorFor(x => x.ServiceCreatedFrom)

Второй аргумент, который вы передавали вызову EditorFor, не делает то, что вы думаете.

Для этого пользовательского шаблона редактора, поскольку вы явно указали формат в свойстве модели представления, <globalization> элемент в вашем web.config и текущая культура потоков будут иметь нулевой эффект. Текущая культура потоков используется со стандартными шаблонами, и если вы не переопределяете формат с помощью [DisplayFormat] приписывать.

Вы можете изменить текущую культуру в своем файле Global.asax для уровня приложения. Например,

using System.Globalization;
using System.Threading;

protected void Application_BeginRequest(Object sender, EventArgs e)
{    
  CultureInfo newCulture = (CultureInfo) System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
  newCulture.DateTimeFormat.ShortDatePattern = "dd-MMM-yyyy";
  newCulture.DateTimeFormat.DateSeparator = "-";
  Thread.CurrentThread.CurrentCulture = newCulture;
}

В качестве потенциального средства для выявления проблемы вы можете: 1. Установить точку останова в точке, в которой вы пытаетесь отформатировать дату 2. Использовать что-то вроде окна Immediate в Visual Studio, чтобы оценить значение

Thread.CurrentThread.CurrentCulture.Name

Если вы сделаете это, это вернется с культурой "ru-RU"?

Я уверен, что я не единственный, кто был бы рад помочь вам решить эту проблему. Тем не менее, возможно, кто-то быстрее меня сможет сразу увидеть проблему:).

Редактировать: похоже, вы используете Razor, поэтому вы должны иметь возможность установить точку останова непосредственно в файле представления в строке, где вы пытаетесь отформатировать дату.

Редактировать № 2:

Может быть, есть более чистый способ сделать это, но если данные формы публикуются в dd.MM.yyyy, то вам может понадобиться пользовательский механизм связывания модели, что-то вроде:

public class CustomModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
              // custom bind the posted date    
        }
}

... который затем будет назначен в качестве связующего элемента модели, например, в ApplicationStart в Global.asax.cs.

Дайте мне знать, если вы думаете, что это может помочь, и я могу уточнить.

Наконец, этот работал для меня, чтобы получить этот формат дд / мм / гггг, который я использовал date = string.Format("{0}/{1}/{2}", Model.Value.Day, Model.Value.Month, Model.Value.Year);

сначала создайте папку EditorTemplates в Sharedfolder, затем создайте шаблон редактора Datetime в Sharedfolder/EditorTemplates/Datetime.cshtml затем перейдите по ссылке выше.

ввиду

@Html.EditorFor(x => x.ServiceCreatedFrom)

Надежда помогает кому-то.

Другие вопросы по тегам