在ASP.NET MVC应用程序中更改日期格式

时间:2013-06-14 10:10:22

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 razor mvc-editor-templates

我需要将日期格式更改为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 个答案:

答案 0 :(得分:14)

以下内容应该有效:

[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调用的第二个参数不符合您的想法。

对于此自定义编辑器模板,由于您在视图模型属性上明确指定了格式,因此web.config中的<globalization>元素和当前线程文化将具有0效果。当前线程文化与标准模板一起使用,并且当您未使用[DisplayFormat]属性覆盖格式时。

答案 1 :(得分:1)

作为识别问题的潜在帮助,您是否能够: 1.在您尝试格式化日期的位置设置断点 2.使用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中。

如果您认为这可能会有所帮助,请告诉我,我可以详细说明。

答案 2 :(得分:1)

最后this一个人为我工作得到这个dd / mm / yyyy格式我使用date = string.Format("{0}/{1}/{2}", Model.Value.Day, Model.Value.Month, Model.Value.Year);

首先在Sharedfolder中创建EditorTemplates文件夹, 然后在Sharedfolder/EditorTemplates/Datetime.cshtml中创建一个Datetime编辑器模板,然后按照上面的链接。

视野

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

希望帮助某人。

答案 3 :(得分: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;
}