【发布时间】: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