【问题标题】:MVC3 Date in UK Format not received on Controller控制器上未收到英国格式的 MVC3 日期
【发布时间】:2016-08-10 18:04:11
【问题描述】:

给定这个虚拟机

public class ApplicationDTO : BaseDTO
{
    public DateTime Date { get; set; }
    public int JobId {get;set;}
    public int Status {get;set;}
    [Required]
    public string Message { get; set; }
    public string ExpertCode { get; set; }
}

因此我有一个隐藏字段

@Html.Hidden("Date", DateTime.Now)

按照我的预期,哪个 fiddler 显示我被发送到服务器(英国格式,我在英国!)

但在控制器上,日期显示为默认最小值。日期

它只是英国格式吗?如果是这样,我最好的方法是什么?虽然目前我将其设置为当前日期,但可能它可以设置为任何给定的日期,即

@Html.HiddenFor(x => x.Date)

我正在使用 AJAX 提交表单,如果这有影响的话。

【问题讨论】:

  • 发布还是获取?我相信Get。 Get MVC 使用文化不变格式(基本上是美国,但也接受 yyyy-mm-dd)。见这里stackoverflow.com/questions/4349589/…
  • 你是对的,它是一个 GET。啊哈。所以听起来我需要设置文化。
  • 不设置文化无济于事。 All Gets 使用文化不变格式,否则您无法传递查询字符串。如果你想避免这种行为,你必须编写一个自定义模型绑定器

标签: c# ajax asp.net-mvc datetime


【解决方案1】:

如果是 Get MVC,则在模型绑定期间默认使用文化不变格式(基本上是美国格式)。所以它不接受英国日期格式。我相信设计原因是查询字符串可以被传递,因此它需要是文化不变的(我不是 100% 相信这种逻辑)。

本文介绍了一个可能的解决方案http://xhalent.wordpress.com/2011/05/14/localization-of-dates-in-asp-net-mvc/

我们只是确保我们永远不会使用英国日期格式进行获取

这个问题也涵盖了Globalization problem with DateTime and ASP.NET MVC 3 Model Binding的问题

【讨论】:

  • 我可以使用 Html.Hidden("Date", DateTime.Now.ToString("yyyy/mm/dd")) 并且它绑定正确。在我的上下文中这对我来说很好,因为用户不需要查看此日期(因此隐藏)。谢谢!
  • 很高兴为您提供帮助。我讨厌在整个应用程序中处理这个问题:)。使用 Ajax 时更容易,您不必担心他们会看到这些值。
  • 确实,这确实意味着当我们必须在英国显示日期并以 yyyy/mm/dd 发回时,有一个相当有趣的桥梁可以越过这条线。猜猜答案是拦截get,手动转换日期并将其发送到服务器。有趣。
【解决方案2】:

您应该使用数据注释来格式化模型或视图模型上的日期

public class ApplicationDTO : BaseDTO
{
   [DisplayFormat(DataFormatString="{0:dd/MM/yyyy}", ApplyFormatInEditMode=true)]
   public DateTime Date { get; set; }
   public int JobId {get;set;}
   public int Status {get;set;}
   [Required]
   public string Message { get; set; }
   public string ExpertCode { get; set; }
}

根据您的要求应用格式。 正如我所看到的,您没有为您的财产提供任何格式

【讨论】:

  • 仍然到达服务器一分钟。日期时间值
【解决方案3】:

我遇到了与 dd.MM.yyyy 格式类似的问题,必须将 web.config 中的全球化元素设置为适当的文化和 uiCulture 属性设置。

【讨论】:

    【解决方案4】:

    如果您使用@Html.Hidden(不是 For 助手),它将无法将请求中的参数与模型中的属性相匹配。

    如果您使用 @Html.HiddenFor(x=>x.Date, "28/2/2013") 您将看到正确填充的日期。

    您还可以验证 Request.Params 集合。在动作中放置一个断点。您会看到其中一个参数有您的日期.... JQuery 不会以任何方式影响这一点。

    【讨论】:

    • 只要名称 HTML 属性匹配,就会绑定。它对上面 vm 上的所有其他属性执行此操作。
    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2021-09-22
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多