MVC3控制器未收到英国格式的日期

4

假设有这个虚拟机

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显示了我发送到服务器的内容(英国格式,因为我在英国!)

enter image description here

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

enter image description here

这是因为日期格式不同吗?如果是,我应该怎么解决呢?目前虽然我将其设置为当前日期,但它实际上可以设置为任何指定日期。

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

我在使用AJAX提交表单,如果这有所不同的话。


发布还是获取?我认为是获取。对于获取,MVC使用文化不变的格式(基本上是美国格式,但也接受yyyy-mm-dd格式)。在这里查看:http://stackoverflow.com/questions/4349589/globalization-problem-with-datetime-and-asp-net-mvc-3-model-binding - GraemeMiller
你说得对,这是一个GET请求。啊哈。听起来我需要设置文化。 - glosrob
不设置区域性是没有帮助的。所有的 Gets 都使用区域性不变的格式,否则你无法传递查询字符串。如果你想避免这种行为,你必须编写自定义模型绑定器。 - GraemeMiller
4个回答

6
如果使用Get MVC,模型绑定期间默认使用区域不变格式(基本上是美国格式)。因此,它不接受英国日期格式。我认为设计原因是可以传递查询字符串,因此需要是区域不变的(我对这种逻辑并不完全信服)。
这篇文章涵盖了一个可能的解决方案 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")),并且它正确地绑定了。在我的情况下,这对我来说很好,因为用户不需要看到这个日期(因此隐藏)。谢谢! - glosrob
很高兴能帮忙。我讨厌在我们的应用程序中处理这个问题:)。当你使用Ajax时,不必担心他们看到值,这样会更容易。 - GraemeMiller
确实,这意味着我们在未来需要显示英国日期并作为yyyy/mm/dd发送时,有一个相当有趣的桥梁要跨越。猜测答案是拦截获取请求,手动转换日期并将其发送到服务器。很有趣。 - glosrob

1
你应该在你的模型或视图模型中使用数据注释来格式化日期。
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; }
}

根据您的要求应用格式。 我发现您没有为您的属性提供任何格式。


2
仍然会到达服务器一个最小日期时间值。 - glosrob

0

我曾经遇到过与 dd.MM.yyyy 格式类似的问题,不得不在 web.config 中设置全球化元素以适当的文化和 uiCulture 属性设置。


0

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

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

此外,您可以验证Request.Params集合。在Action中设置断点。您将看到其中一个Params具有您的日期.... JQuery不会以任何方式影响此操作。


只要名称HTML属性匹配,它就会绑定。 它会对vm上面的所有其他属性执行此操作。 - glosrob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接