Asp.net mvc 为什么ASP NET MVC中的日期格式在Html帮助程序中使用时不同?

Asp.net mvc 为什么ASP NET MVC中的日期格式在Html帮助程序中使用时不同?,asp.net-mvc,datetime-format,Asp.net Mvc,Datetime Format,我刚刚遇到一个非常有趣的问题。如果我使用ViewData将日期时间值传递给视图,然后将其显示在文本框中,即使我以完全相同的方式使用String.Format,使用Html.textbox帮助程序时也会得到不同的格式设置结果 <%= Html.TextBox("datefilter", String.Format("{0:d}", ViewData["datefilter"]))%> <input id="test" name="test" type="text" value="

我刚刚遇到一个非常有趣的问题。如果我使用ViewData将日期时间值传递给视图,然后将其显示在文本框中,即使我以完全相同的方式使用String.Format,使用Html.textbox帮助程序时也会得到不同的格式设置结果

<%= Html.TextBox("datefilter", String.Format("{0:d}", ViewData["datefilter"]))%>
<input id="test" name="test" type="text" value="<%: String.Format("{0:d}", ViewData["datefilter"]) %>" />

上述代码呈现以下html:

<input id="datefilter" name="datefilter" type="text" value="2010-06-18" />
<input id="test" name="test" type="text" value="18/06/2010" />

请注意,使用Html帮助器的第一行是如何以一种方式生成日期格式的,而第二行是如何生成完全不同的输出的。你知道为什么吗


注意:我目前在巴西,所以这里的标准短日期格式是dd/MM/yyyy。

发生这种情况的原因是TextBox帮助程序使用存储在
ViewData[“datefilter”]中的值
,因为它的名称是
datefilter
,并且完全忽略了您传递的第二个参数,该参数应该用于格式化日期。尝试更改文本框的名称

更好的解决方案是使用编辑器模板和强类型视图,而不是
ViewData
。这里有一个例子

型号:

public class MyModel
{
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", 
                   ApplyFormatInEditMode = true)]
    public DateTime Date { get; set; }
}
控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyModel
        {
            Date = DateTime.Now
        };
        return View(model);
    }
}
视图:


x、 日期)%>

+1看一下最后三段,它进一步澄清了Darin的答案。日期仍应使用当前区域性进行评估,但不是使用当前区域性。为什么?我现在明白我所做的了。ViewData不仅有一个带有“datefilter”名称的键,而且还有路由参数的名称。因此,即使在完全删除ViewData之后,Html.TextBox(“datefilter”)仍然在从ModelState或其他地方提取它。我只是不知道为什么不像艾哈迈德说的那样按照当前的文化进行格式化。但多亏了你们,我想现在我更明白了这些助手应该如何使用。另外,感谢这个伟大的例子,它看起来可能很简单,但实际上比使用ViewData好得多
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SomeNs.Models.MyModel>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <%: Html.EditorFor(x => x.Date) %>
</asp:Content>