【问题标题】:MVC4 format date does not validate with DisplayFormat valueMVC4 格式日期不适用于 DisplayFormat 值
【发布时间】:2013-08-05 11:29:15
【问题描述】:

我已经看到了大约 1000 条关于此的帖子,但我一定错过了什么。

基本上,我尝试在我的网站中使用 dd/MM/yyyy 格式,验证时出现问题。

我有一个 ViewModel:

   public class LoanBaseViewModel
    {
        public int LoanId { get; set; }

        [Required]
        [DataCompareValidation("ReturnDate", ErrorMessage = "Return date should be later than loan date")]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
        public DateTime LoanDate { get; set; }


        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        [DataType(DataType.Date)]
        public DateTime? ReturnDate { get; set; }
}

在我的 EditorTemplate 我有这个:

@model System.Nullable<System.DateTime>
@if (Model.HasValue)
{
    @Html.TextBox("", String.Format("{0:dd/MM/yyyy}", Model.Value), new { @class = "jq-date" })
}
else
{
    @Html.TextBox("", "", new { @class = "jq-date" })
}

在页面加载时,我在 jq-date 上附加了一个 Jquery DatePicker。

 $("#loanForm").find(".jq-date").datepicker({ dateFormat: 'dd/mm/yy' });

显示工作正常,但每次我尝试保存时,如果我使用 dd/MM/yyyy 日期,它会告诉我日期格式不正确。

知道为什么吗?

我已经尝试了大约一个小时,这让我发疯了!

感谢您的宝贵时间

汤姆

编辑: 没有更好的工作 真正奇怪的是它可以在我的笔记本电脑上工作,但不能在我的桌面上工作,它们都以 dd/MM/yyyy 显示日期,我的笔记本电脑接受 25/08/2013 但不是我的桌面......

编辑: 解决方案在这里:stackoverflow.com/a/13528769/1741443。

【问题讨论】:

    标签: .net asp.net-mvc-4 ef-code-first


    【解决方案1】:

    如果不了解您是如何格式化 jQuery 日期选择器,则很难明确回答。 jq-date 的默认返回是 mm/dd/yy(所有数字数据)。

    您设置的格式是与字段相关的格式;等待 jQuery 以它期望的格式向它传递日期的字段。字段级格式不适用于 jQuery - 这是一个单独的格式要求。

    1. 我建议你将 ApplyFormatInEditMode 关闭 / false 并查看日期字段是否与 datepicker 一起正常工作。

    2. 如果这不起作用,则根据以下内容格式化 jq-date。

    有关 Datepicker 格式化选项的更多信息,请查看 API documentation 或转到 this page

    我确定您已经在页面上同时引用了 jQuery 和 Jquery UI,但您应该为该日期选择器添加以下自定义:

    <script type="text/javascript">
    $(function(){ 
    $('.datepicker').datepicker({dateFormat: 'dd-M-yy'});
     });
    </script>
    

    在上面的示例中,jQuery 格式返回 dd - 两位数的月份日期,M - 月份的简称,以及 yy - 四位数的年份。

    希望对您有所帮助。

    【讨论】:

    • 您好,感谢您的回答。我确实使用了这样的初始化日期选择器: $("#loanForm").find(".jq-date").datepicker({ dateFormat: 'dd/mm/yy' });我不确定是引发错误的日期选择器,但更像是发布时的数据验证。
    • 失败了,您是否想过将您的文化设置从 en-US 更改为 en-GB,这将立即为您调整日期。 [msdn.microsoft.com/en-us/library/… 引用了这样一个事实,即格式方法显示在 en-US 的默认示例中,即 mm/dd/yy。
    • 尝试了 en-GB 并没有在我的桌面上产生影响。但我的笔记本电脑接受 dd/MM/yyyy 日期。
    • @Tom 您是否尝试过在您的桌面上使用不同的浏览器来测试它是否是 Chrome/IE/Firefox/Safari/Opera 问题?
    • 好的修复它我使用了这个解决方案:stackoverflow.com/a/13528769/1741443。似乎正在使用chrome,我将测试FF Tomorrow。谢谢!
    【解决方案2】:

    假设您的服务器文化未设置为您要使用的文化格式,您需要将 web.config 中的全球化设置设置为您计划使用的文化。我不知道你来自哪里,但我会假设是英国。所以你可以设置

     <globalization culture="en-GB"/>
    

    这应该在&lt;system.web&gt;

    您也可以使用culture="auto",在这种情况下,将根据用户浏览器文化设置来选择文化。

    执行此操作并使用[DataType] 属性时,您甚至不需要使用[DisplayFormat] 属性。

    您也可以考虑使用HtmlAttributeProvider 将 jq-date 属性添加到您的日期类型中,这样就不需要任何编辑器模板来满足您的需要。见:

    http://blogs.msdn.com/b/ukadc/archive/2012/05/24/asp-net-mvc-adding-html-attributes-in-templated-helpers-editorfor.aspx

    如果您的问题完全出在客户端使用 jquery 日期控件,那么请确保您在 jquery 就绪处理程序中对其进行初始化(并且您不需要表单 id 或查找,只需使用类在 jquery 选择器本身中)。

    $(function() {
        $(".jq-date").datepicker({ dateFormat: 'dd/mm/yy' });
    });
    

    【讨论】:

    • 真正完整的答案谢谢。我添加了文化信息,但效果不佳。真正奇怪的是它可以在我的笔记本电脑上工作,但不能在我的桌面上工作,它们都以 dd/MM/yyyy 显示日期,我的笔记本电脑接受 25/08/2013 但不是我的桌面......这到底是什么?
    • @Tom - 你是在 IIS 中运行它吗? IIS 快递?开发服务器?什么版本的jQuery?确切的错误是什么?
    • 我正在开发 IIS express,Jquery 1.8。确切错误:“字段 LoanDate 必须是日期”。当我在笔记本电脑上输入错误日期时,我收到另一条消息“日期 06/29/2013 不是有效日期”
    • 好吧,就像 springbokkie 建议的那样,我刚刚看到 chrome 给了我错误,而不是 firefox ......这很奇怪
    【解决方案3】:

    这可能是日期选择器格式的问题。您可以像这样在初始化期间设置它

     var dateTypeVar = $('#datepicker').datepicker('getDate');
     $.datepicker.formatDate('dd-mm-yy', dateTypeVar);
    

    您还可以设置默认日期时间格式。这里有更多信息的链接

    【讨论】:

    • 感谢您的回答,我明天会尝试,但我确实在 jquery 日期选择器 $("#loanForm").find(".jq-date").datepicker({ dateFormat: 'dd/mm/yy' });.我认为如果我删除日期选择器效果不会更好,控件仍然被验证为 MM/dd/yyyy 而我想要 dd/MM/yyyy
    • 在你得到 dd/MM/yyyy 的那一刻,你的代码中的一个地方还有 MM/dd/yyyy
    • 第二次约会很好,我删除了日期选择器,但仍然不起作用,所以它确实是不显眼的验证所期望的格式,不起作用。
    • @Tom - MVC 没有不显眼的日期验证。日期被发布到服务器,如果无法解析,则会生成错误。
    • 似乎不是这样,请参阅 stackoverflow.com/a/13528769/1741443
    【解决方案4】:

    将以下代码添加到 global.asax.cs 文件中

    受保护的无效 Application_BeginRequest() {

    CultureInfo 信息 = 新 CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString()); info.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy"; System.Threading.Thread.CurrentThread.CurrentCulture = 信息;

    }

    并将以下内容添加到

    下的 web.config

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2016-05-28
      • 1970-01-01
      相关资源
      最近更新 更多