Изменить формат даты в приложении 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;
};
}
Ничего не работало для меня.
Ответы
Ответ 1
Следующее должно работать:
[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]
.
Ответ 2
Как потенциальная помощь для выявления проблемы, можете ли вы:
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.
Сообщите мне, если вы думаете, что это может помочь, и я могу уточнить.
Ответ 3
наконец этот работал у меня, чтобы получить этот формат dd/mm/yyyy, который я использовал 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)
Надежда помогает кому-то.
Ответ 4
Вы можете изменить текущую культуру в файле 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;
}