【问题标题】:MVC Model is changing day and month on german dateMVC 模型在德国日期更改日期和月份
【发布时间】:2019-07-19 05:23:11
【问题描述】:

我尝试了几种方法,但我不知道为什么,但这让我感到困惑。

型号:

public class SearchViewModel
    {        
        [DisplayName("Date from:")]
        //[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{dd.MM.yyyy}")]
        public DateTime? DateFrom { get; set; }

        [DisplayName("Date to:")]
        public DateTime? DateTo { get; set; }
    }

查看:

@using (Html.BeginForm("SearchResult", "Search", FormMethod.Get, new { @id = "searchForDate" }))
{
    <div id="criterias">


        @Html.LabelFor(m => m.DateFrom)
        @Html.EditorFor(m => m.DateFrom, new { htmlAttributes = new { @class = "searchinput datepicker" } })

        @Html.LabelFor(m => m.DateTo)
        @Html.EditorFor(m => m.DateTo, new { htmlAttributes = new { @class = "searchinput datepicker" } })
</div>
    <button type="submit" class="btn btn-danger" style="background-color:#991821; margin-top:15px;" id="search">Search</button>
}

问题:

日期选择器工作正常。当我加载页面时,我点击 EditorFor DateFrom 框并选择一个日期,比如说 02.01.2019(2019 年 1 月 2 日)。当我点击提交时,它会跳转到控制器操作中。

在控制器操作中model.DateFrom 正在更改日期和月份。这意味着它突然是 01.02.2019(2 月 2 日),这是完全错误的。当我在12 上方选择一天时,model.DateFrom 无效。

我尝试了以下方法:

  • 在模型中插入[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{dd.MM.yyyy}")]
  • 在我的Web.config 中添加了<system.web> <globalization uiCulture="de-DE" culture="de-DE" /></system.web>
  • 在控制器中添加了 InternationalizationAttribute --> CurrentCulture 和 CurrentUICulture
  • 尝试使用几个设置将EditorFor 修改为TextboxFor:参见Date only from TextBoxFor()

我也看到了这篇文章:MVC DateTime binding with incorrect date format 但不幸的是,我知道如何不是那么好。

我不知道为什么会发生这种情况,更重要的是发生在哪里?我将断点放入 Internationalization 类,将 bp 直接放在 SearchController 操作下。没有任何帮助。当我点击提交按钮时,日期和月份正在改变位置......

【问题讨论】:

  • 最好将日期和时间视为字符串。您可能遇到的问题是客户端的语言环境和服务器的语言环境不同。许多欧洲国家使用dd-MM-YYYY,而美国将使用MM-dd-YYYY。如果你不通过本地化解析等来解决这个问题,你很可能会遇到这个问题。我认为“如何修复它”高度依赖于场景,但我会使用字符串并跳过从字符串到日期的隐式模型绑定。
  • 好的,我做到了。将其更改为字符串,现在它正在工作。但我想知道哪个机制被触发,或者在按下 Search 按钮和触发 action 方法之间发生了什么。在点击搜索和调用操作方法之间存在日/月的变化。我不知道为什么。
  • 我将我的评论迁移到一个答案,因为它对你有帮助。我还添加了一些可能有用的附加信息。

标签: c# date datetime model-view-controller model


【解决方案1】:

* 将我的评论移至答案,并提供一些额外信息。

最好将日期和时间视为字符串。您可能遇到的问题是客户端的语言环境和服务器的语言环境不同。许多欧洲国家使用dd-MM-YYYY,而美国将使用MM-dd-YYYY。如果你不通过本地化解析等来解决这个问题,你很可能会遇到这个问题。我认为“如何修复它”高度依赖于场景,但我会使用字符串并跳过从字符串到日期的隐式模型绑定。

更新信息

还有更长的解释,但基本上当前的文化使用服务器上的默认格式,但浏览器的当前文化使用不同的格式。 (如上所述。)You can change the culture,但这可能会很困难,具体取决于您的预期受众和团队规模。我已经在有限的情况下对此进行了测试,但由于存在几个潜在的未经测试的陷阱,因此不一定会推荐它。 (您的 QA、单元测试等必须包括所有可能的文化差异,例如在数值中交换逗号和小数点 [5.00 vs 5,00]、日期格式等)

我的首选方法是对所有潜在问题使用通用合同格式,然后客户端(您的 Web UI)可以在将值发送到后端/API 之前正确格式化该值。对于日期和日期时间,我使用 ISO 8601 格式,并且接受的变量类型是后端的字符串。

日期值将被列为,例如,2019-02-26 (YYYY-MM-dd)。我喜欢这个有几个原因:

  • 日期格式不会因格式而异。
  • 字符串的值部分没有被错误解析。
  • 客户端和服务器之间不会出现UTC/偏移问题。
  • ISO 格式字符串是可排序的。

【讨论】:

    【解决方案2】:

    您可以尝试检查“接受语言”HTTP 请求标头。只需弹出开发工具 Network 选项卡,然后单击您的请求标头进行搜索。

    accept-language:en-US,en;q=0.9
    

    这是预期的吗?

    另外,请看这个问题:

    MVC DateTime binding with incorrect date format

    具体来说,这个资源来自答案:

    https://weblogs.asp.net/melvynharbour/mvc-modelbinder-and-localization

    希望对你有帮助!

    编辑:另外,如果您还没有,我建议对所有服务器端日期使用 UTC。客户端日期可以/应该是当地时间。

    【讨论】:

    • 谢谢你在我的问题中看到我已经提到了这个链接:)
    • 啊,是的!我的错。我想把它作为评论,但没有足够的业力。不过我喜欢另一个答案,它似乎解决了您的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多