DateTime的文本框格式错误

时间:2014-10-19 21:24:40

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

我知道这是最常见的问题之一。 我有解决方案,但我目前的项目让我疯了。 我使用完全相同的代码,结果仍然不同。

这是我通常用来格式化日期的代码:

@Html.TextBoxFor(m => m.DateOfAgenda, "{0:dd/MM/yyyy}")

通常这应该会导致2014年7月10日,但由于某种原因,它会导致07-10-2014 当我在另一个项目中测试它时,上面的代码按预期工作。

作为测试,我比较了以下几行的结果:

@Html.TextBoxFor(m => m.DateOfAgenda, "{0:dd/MM/yyyy}")
/* result: 07-10-2014*/
@Html.TextBoxFor(m => m.DateOfAgenda)
/* result: 7-10-2014 00:00:00*/

所以我的代码似乎部分工作只有' - '不会被'/'取代 有人知道如何一劳永逸地处理这个问题吗?

修改

我有自定义代码设置文化。 它使用路径将其设置为特定文化(默认为'nl') 当我将下面的代码放在评论中时,一切似乎都有效。 但我需要这部分来加载我的资源(标签文本,错误,......)。

var language = handler.RequestContext.RouteData.Values["language"];

if (language != null)
{
    Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(language.ToString());
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(language.ToString());
}

更具体地说,这一行打破了格式

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(language.ToString());

有人知道为什么吗?我希望{0:dd/MM/yyyy}具有优先权,因为它是明确设置的。 有趣的是,/刚刚被翻译为-。 当我使用{0:dd//MM//yyyy}时,会产生19--10--2014

修改

很抱歉我迟到了,但我找不到时间尝试这个。 所以基本上问题是文化和我的格式设置。

@Html.TextBoxFor(m => m.DateOfAgenda, "{0:dd/MM/yyyy}")

'/'仍会被您的文化指定的分隔符取代。 我的文化被设置为'nl',但默认情况下会产生'nl-nl',他们使用' - '作为日期分隔符。我住在比利时'nl-be',在这里我们使用'/'。 可以设置我的文化或改变格式。 下面的代码完成了这个伎俩。

@Html.TextBoxFor(m => m.DateOfAgenda, "{0:dd'/'MM'/'yyyy}")

4 个答案:

答案 0 :(得分:5)

我对ASP.NET MVC并不熟悉,但如果您没有指定格式,则使用当前文化DateTimeFormat。另外,/是.NET中的一种特殊格式说明符,意思是“用当前DateTimeFormat的日期分隔符替换我,该日期分隔符似乎是-

因此,您应该使用CultureInfo.InvariantCulture提供\\/或屏蔽格式说明符:

@Html.TextBoxFor(m => m.DateOfAgenda, "{0:dd\\/MM\\/yyyy}")

或使用字符文字'/'

@Html.TextBoxFor(m => m.DateOfAgenda, "{0:dd'/'MM'/'yyyy}")

阅读:The "/" Custom Format Specifier

答案 1 :(得分:1)

这似乎是设计上的。 TextBoxFor根据以下代码段设置值

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

调用HtmlHelper

的EvalString方法
internal string EvalString(string key, string format)
{
  return Convert.ToString(ViewData.Eval(key, format), CultureInfo.CurrentCulture);
}

调用ViewDataDictionary

的Eval方法
public string Eval(string expression, string format)
{
  object value = Eval(expression);
  return FormatValueInternal(value, format);
}

internal static string FormatValueInternal(object value, string format)
{
  ....
  return String.Format(CultureInfo.CurrentCulture, format, value);
}

因此该值使用当前文化的格式。我认为这是因为DefaultModelBinder使用当前的文化信息将日期的字符串表示形式解析回DateTime(如果您能够覆盖它,除非您创建了自定义,否则它不会绑定模型活页夹。

答案 2 :(得分:0)

查看页面

@Html.TextBoxFor(m => m.DateOfAgenda, new { Value = Model.DateOfAgenda.ToString("dd/MM/yyyy")});

答案 3 :(得分:0)

模特页面

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

查看页面

@Html.EditorFor(model => model.DateOfAgenda)