15

我需要将日期格式更改为dd.MM.yyyy. 我收到客户端验证错误,因为 ASP.NET MVC 日期格式与我对服务器的期望不同。

为了更改 ASP.NET MVC 日期格式,我尝试了:

网络配置:

<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

4 回答 4

15

以下应该有效:

[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]属性覆盖格式时。

于 2013-06-14T10:17:42.293 回答
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    
        }
}

...然后将在 Global.asax.cs 中的 ApplicationStart 中分配为模型绑定器。

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

于 2013-06-14T10:16:52.303 回答
1

最后,对我有用,以获得我使用的这种 dd/mm/yyyy 格式date = string.Format("{0}/{1}/{2}", Model.Value.Day, Model.Value.Month, Model.Value.Year);

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

在视野中

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

希望对某人有所帮助。

于 2015-03-30T15:28:43.713 回答
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;
}
于 2015-12-30T14:04:29.393 回答