关于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 中失败。但我不明白为什么…

  • 你在 IE 中使用什么语言设置?托管网站的服务器的语言是什么?
  • 谁说 mm/dd/yyyy 是”正确”的方式?也许是你想要的方式,但仅限于某些地方。
  • 是的,通过”正确”的方式,我的意思是对于这个特定的项目,我想保持所有日期一致。我的问题纯粹是关于保持一致的日期/发布不同浏览器的问题。如果我使用 yyyy/mm/yyyy 对我来说并不重要,但如果它随机切换到 mm/yyyy/yyyy,它就不会是”正确的”
  • @JohnKoerner IE 中的语言设置为英语(加拿大)[en-CA]。我只是使用集成开发服务器尝试这个,我还没有添加任何关于项目本地化的内容。据我所知,一切都默认为英语,但我现在遇到的主要问题是 IE 根本不会绑定那个特定的 SearchByDate 值。
  • 我真的认为这是一个 I18N 问题。由于您使用的是 ASP.Net 开发服务器,因此可能会默认使用您的操作系统语言。根据该语言的文化设置,它可能期望日期为 dd/mm/yyyy


谢谢大家的帮助。

@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) %>” />


  • 我刚刚尝试过,这是同样的问题。我现在才意识到我认为问题出在实际的数据绑定上。请参阅主帖中的编辑


来源:https://www.codenong.com/10758740/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?