我知道这是最常见的问题之一。 我有解决方案,但我目前的项目让我疯了。 我使用完全相同的代码,结果仍然不同。
这是我通常用来格式化日期的代码:
@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}")
答案 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}")
答案 1 :(得分:1)
这似乎是设计上的。 TextBoxFor根据以下代码段设置值
string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);
的EvalString方法
internal string EvalString(string key, string format)
{
return Convert.ToString(ViewData.Eval(key, format), CultureInfo.CurrentCulture);
}
的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)