【问题标题】:The specified value does not conform to the required format yyyy-MM-dd指定的值不符合要求的格式 yyyy-MM-dd
【发布时间】:2015-08-28 05:13:48
【问题描述】:

我有一个使用数据注释、Entity-Framework Jquery 2.1.3 和 Jquery UI 1.11.4 的 .Net MVC 5 应用程序。

当我使用英国格式“dd/MM/YYYY”呈现带有日期类型输入的编辑表单时;使用谷歌浏览器时出现以下错误信息:

指定的值“10/10/2001”不符合要求的格式“yyyy-MM-dd”。 jquery-2.1.3.js:5317

型号

public class MyModel
{
    [Column(TypeName = "date"), DataType(DataType.Date), Display(Name = "My date")]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public string MyDate { get; set; }
}

标记

<input class="text-box single-line" data-val="true" data-val-date="The field My date must be a date." id="MyDate" name="MyDate" type="date" value="10/10/2001" />

输入控件中的值设置正确,但日期未显示在浏览器中。我首先认为这是 jQuery 的问题,因为它出现在 jQuery 脚本文件中,但是在 IE 和 Firefox 中测试时一切正常。

然后我认为这是我在 chrome 中的区域设置,因为默认情况下 Chrome 认为每个英国人都在美国,我将区域设置更改为 UK,但仍然出现同样的问题。

一个简单的解决方法是将我的模型中的格式更改为通用格式,但对于英国用户来说,这有点陌生。

有没有办法告诉 chrome 接受“dd/MM/YYYY”中的日期格式?

【问题讨论】:

  • 您是否要渲染浏览器的 HTML5 日期选择器实现(或者您是否使用 jquery 插件)?
  • 我建议你使用datepicker ui这样ISO格式发送到服务器,而dd/MM/dddd将在客户端配置。
  • @StephenMuecke 我打算让浏览器处理日期选择器,因此对第三方库的需求减少了。
  • 如果您使用浏览器日期选择器,您需要将属性指定为[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyInEditMode = true)]。然后浏览器将在浏览器的区域设置中显示该值,但回发 ISO 格式以便正确绑定。但请注意,这仅在现代浏览器中受支持。
  • 在使用 DisplayFor() 辅助方法时,这样做还会以通用格式呈现日期

标签: jquery asp.net-mvc google-chrome datetime data-annotations


【解决方案1】:

HTML5 日期选择器的规范规定日期必须采用yyyy-MM-dd 格式(ISO 格式)。这意味着你DisplayFormatAttribute必须是

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public string MyDate { get; set; }

或者,您可以使用手动添加格式

@Html.TextBoxFor(m => m.MyDate, "{0:yyyy-MM-dd}", new { @type = "date"  })

后一个选项允许您保留DataFormatString = "{0:dd/MM/yyyy}") 以供在@Html.DisplayFor() 中使用

【讨论】:

  • 加载页面后,有没有比使用 JS 重新格式化框更简洁的解决方法? [DisplayFormat] 导致 jQuery 重置字段并在控制台中给出无效值消息。将其格式化为 TextBoxFor 可解决此错误(并允许我应用我的掩码插件),但仍以 ISO 格式显示日期。在 domReady 上,我移动值以使用美式格式。
  • @Sinjai,对不起,我不明白你的评论。 [DisplayFormat] 和 jQuery 无论如何都不相关(它不会重置值),并且这个问题/答案与浏览器 HTML-5 日期选择器实现有关(它与掩码插件无关)。如果您遇到问题,请提出一个包含相关详细信息的新问题
  • 是的,评论中的旁白可能太多了。不过,我没有更好的方式来表达一个问题。 jQuery 在 ASP.NET MVC 项目中用于验证,我想这就是可怕的地方。控制台只是说错误源于 jquery-version.js。别担心。
  • 我知道这是一个老问题,但我希望得到一个答案,写一个关于这个的正式问题感觉很愚蠢......ApplyFormatInEditMode = true 用于保持@Html.EditorFor() 的格式正确?那么,当我尝试用DateTime[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 填充@Html.EditorFor() 时,我仍然在控制台中遇到那个错误(问题中的那个)。有什么想法吗?还是我将Edit mode 与其他东西混淆了?
  • @FllnAngl,如果它不适合你,那么我只能假设你有其他代码,或者你没有告诉我们导致问题的东西。
【解决方案2】:

问题可能来自 type="date"。反正我的情况就是这样。一旦将其更改为 type="text" 即可工作。如果接口是使用 MVC 包装器构建的,则需要相应地替换或设置 html 属性。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 我怎样才能只为 Chrome 执行此操作。但不是 IE?
    【解决方案4】:

    type 属性设置为文本。

    @Html.TextBoxFor(m => m.MyDate, new { @type = "text"  })
    

    【讨论】:

      【解决方案5】:

      您不需要任何 jquery 或 ASP 功能来修复它。简单的 JS 就可以了。 问题是浏览器需要格式 yyyy-mm-dd。

      并且 toLocaleString 不允许日期采用这种格式。所以经过搜索我发现这是ISO格式,我们可以使用 Date().toISOString() 来获取所需格式的日期。

      我使用 slice 方法提取日期部分只是因为 Date().toISOString() 返回日期和时间。

      我的代码:

      date: new Date().toISOString().slice(0, 10)
      

      【讨论】:

        【解决方案6】:

        我想在此处的答案中强调一些内容。

        如果您正在构建具有全球化和本地化的应用程序,那么使用 Html 帮助器传递格式的方法会更好。您也可以只使用 EditorFor 并为 datepicker 传入必要的 id 或类。

        【讨论】:

          【解决方案7】:

          我也遇到了同样的问题 我这样做了,它开始工作了

          <input type="date" class="form-control text-box single-line" id="EndDate" name="EndDate" value=@Model.EndDate.ToString("yyyy-MM-dd") />
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-06-04
            • 2016-01-02
            • 1970-01-01
            • 2013-08-31
            • 2021-12-18
            相关资源
            最近更新 更多