文本框的日期时间格式错误

7

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

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

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

通常这应该得到07/10/2014,但出于某种原因却得到了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}")

1
可能是 CultureInfo 的问题? - h__
Cultureinfo 在我的 global.asax 中根据路由设置。 目前它被设置为 'nl'。 - Beejee
4个回答

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}")

阅读: "/"自定义格式说明符


该链接介绍了如何使用日期格式的"/"自定义格式说明符。

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(如果您能够覆盖它,除非您创建自定义模型绑定程序,否则它不会绑定)。

0

模型页面

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

查看页面

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

0

查看页面

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

计算括号和花括号的数量。你的答案是错误的。 - sampathsris
嗨,krumia,那是我的错误,漏掉了一个“}”..再试一次。 - user1364100
在括号内使用@值 - user1364100

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