关于asp.net mvc 3:javascript和c#模型之间的日期格式不一致

Date formats inconsistant between javascript and c# models

**更新

我刚刚意识到,除非我使用 firefox,否则日期在发布期间根本没有数据绑定。

为什么浏览器会影响服务器端的数据绑定?

我觉得我正在服用疯狂的药丸

我的问题是我有一个 JQuery 日期选择器,它的格式似乎正确(mm/dd/yyyy),但是当值被发布到服务器时,月份和日期会被切换。

date 属性是这样添加到页面中的(它被隐藏了,只是为了可以在发帖时绑定。如果它是一个简单的文本框,问题也是一样的):

1
<input type="hidden" name="SearchByDate" id="SearchByDate" value="<%: ((DateTime)Model.SearchByDate).ToString(Web.Common.Config.GetDateFormatBase) %>" />

在我的视图模型中,我这样指定日期格式:

1
2
3
    [DisplayFormat(DataFormatString = Common.Config.GetDateFormat,
        ApplyFormatInEditMode = true)]
    public DateTime? SearchByDate { get; set; }

我的 javascript 日期选择器格式如下:

1
2
3
4
5
6
7
8
        $("#appointmentDateDiv").datepicker({
------>     dateFormat:"<%= Web.Common.Config.GetDateFormatJavascript %>",
            changeMonth: true,
            onSelect: function (dateText, inst) {
                $("#SearchByDate").val(dateText);
                $("form").submit();
            }
        });

我实际上是在这样的一个通用类中对格式进行了分隔:

1
2
3
public const string GetDateFormatBase = @"MM/dd/yyyy";
public const string GetDateFormat = @"{0:" + GetDateFormatBase +"}"; //This is for annotations
public const string GetDateFormatJavascript ="mm/dd/yy";

如您所见,格式都是 sam:month day year。
当我第一次加载这样的页面时,一切看起来都很好,所以日期选择器让我可以选择正确格式的日期。然后我发布,如果我单步执行我的代码,一切看起来仍然很好。我什至重新格式化日期以确保在返回视图之前。但是月份和日期总是会切换。

不过,最奇怪的是,在 Firefox 中一切正常。它在 IE、Chrome 和 Opera 中失败。但我不明白为什么...


谢谢大家的帮助。

@JohnKoerner,你是对的,这是一个 l18n 问题。我的 Firefox 设置为 en-US,而我的其他浏览器设置为 en-CA。我不认为他们会是不同的日期格式,但他们是。这在模型绑定期间引起了问题。我的解决方案是使用不变文化来解析自定义模型活页夹中的所有日期。我从这里得到了这个想法。

但是,我已经使用了与这里不同的模型绑定器。我像这样修改了相关的代码

1
retVal = (Nullable< T >)value.ConvertTo(typeof(T), CultureInfo.InvariantCulture);

我们正在解析的日期时间在哪里。

另一件事是确保为 DateTime 和 DateTime 注册自定义模型绑定器?像这样:

1
2
ModelBinders.Binders.Add(typeof(DateTime), new DateTimeModelBinder());
ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeModelBinder());

您可以在隐藏字段中使用 String.Format:

1
2
<input type="hidden" name="SearchByDate" id="SearchByDate" value="<%:
String.Format("
{0:MM/dd/yyyy}",Model.SearchByDate) %>" />