11

Мне нужно изменить формат даты, чтобы быть dd.MM.yyyy. Я получаю ошибку проверки на стороне клиента, потому что формат даты ASP.NET MVC отличается от того, что я ожидаю на сервере.Изменить формат даты в приложении 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; 
     }; 
} 

Ничто не работает для меня.

+1

я была аналогичная проблема: http://stackoverflow.com/questions/13623381/unobtrusive- datetime-validation-in-mvc4 – NickD

+0

уродливый, но, вероятно, единственный способ :( – Andrei

+1

да, уродливый путь. Это должно быть сделано каркасом ;-) – NickD

ответ

12

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

[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, и текущая культура потока будет иметь эффект 0. Текущая культура потоков используется со стандартными шаблонами и когда вы не переопределили формат с атрибутом [DisplayFormat].

+0

Хе-хе, я знал, что кто-то будет быстрее :). – sammy34

+0

Спасибо за ответ. Но я все еще получаю исключение для проверки, просто потому, что приложение ожидает MM.dd.yyyy – Andrei

+0

Было бы лишним добавить пользовательское связующее устройство для этого случая? Я не уверен, что связующее устройство по умолчанию рассматривает текущую культуру. – sammy34

1

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

Thread.CurrentThread.CurrentCulture.Name 

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

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

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

Edit # 2:

Там может быть чище способ сделать это, но если данные формы их размещения в ДД.ММ.ГГГГ, то вам может понадобиться пользовательские модели вяжущее, что-то вроде:

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

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

Сообщите мне, если вы считаете, что это может помочь, и я могу уточнить.

+0

Культура ru-RU. Я проверил :) – Andrei

1

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

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

ввиду

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

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

1

Вы можете изменить текущую культуру в файле 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; 
} 
Смежные вопросы