无法解析MVC DateTime格式

时间:2013-06-27 19:51:33

标签: asp.net-mvc datetime format display-templates asp.net-mvc-migration

最近从MVC3升级到4后,我遇到了一些日期时间问题。我显示这样的日期属性:

<%: Html.DisplayFor(m => m.InvoiceDate, "datetime")%>&nbsp; 

“datetime”是一个显示模板,如下所示:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DateTime?>" %>
<%: Model.HasValue ? Model.Value.ToString("dd/MM/yy", null) : ""%>

在我的global.asax文件中,我注册了以下模型绑定器:

 ModelBinders.Binders.Add(typeof(DateTime), new SMEEDI.Portal.Common.DateTimeModelBinder());
 ModelBinders.Binders.Add(typeof(DateTime?), new SMEEDI.Portal.Common.DateTimeModelBinder());

看起来像这样:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var date = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;

        if (String.IsNullOrEmpty(date))
            return null;

        bindingContext.ModelState.SetModelValue(bindingContext.ModelName, bindingContext.ValueProvider.GetValue(bindingContext.ModelName));

        try
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-NZ");
            return DateTime.Parse(date, CultureInfo.CurrentCulture.DateTimeFormat);
        }

        catch (Exception)
        {

            bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format("\"{0}\" is invalid.", bindingContext.ModelName));

            return null;

        }

日期时间在视图中正确显示,但是在提交表单时,日期返回如下:“7/20/2013 12:00:00 AM”并且DateTimeModelBinder抛出格式异常:字符串不是被识别为有效的DateTime。 (新西兰的月份和日期相反)。

为什么会以这种格式返回?为什么不能解析呢?升级到MVC 4时为什么会这样?我怎样才能让它以新西兰格式返回?我是否应该在解析时不指定文化,这可能是以前MVC版本中可能需要的东西吗?

1 个答案:

答案 0 :(得分:0)

这是一个棘手的领域。涉及的因素很多。

其中一个原因可能是网页浏览器设置为美国英语。

如何设置线程的文化信息。您可以使用Thread.CurrentThread.CurrentCulture或在网络配置<globalization enableClientBasedCulture="true" culture="auto:en-NZ" uiCulture="auto:en"/>中执行此操作。