ASP.NET MVC3 - DateTime格式

时间:2011-10-20 12:00:03

标签: asp.net-mvc-3 datetime

我正在使用ASP.NET MVC 3.
我的ViewModel看起来像这样:

public class Foo
{
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
    public DateTime StartDate { get; set; }
    ...
}

在视图中,我有这样的事情:

<div class="editor-field">
    @Html.EditorFor(model => model.StartDate)
    <br />
    @Html.ValidationMessageFor(model => model.StartDate)
</div>

StartDate以正确的格式显示,但当我将其值更改为19.11.2011并提交表单时,我收到以下错误消息:“值'19 .11.2011'对StartDate无效。”

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:42)

您需要在web.config文件的全球化元素中设置适当的文化,dd.MM.yyyy是有效的日期时间格式:

<globalization culture="...." uiCulture="...." />

例如,这是德语的默认格式:de-DE


更新:

根据您在评论部分中的要求,您希望保留应用程序的en-US文化,但仍然使用不同的日期格式。这可以通过编写自定义模型绑定器来实现:

using System.Web.Mvc;
public class MyDateTimeModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var displayFormat = bindingContext.ModelMetadata.DisplayFormatString;
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (!string.IsNullOrEmpty(displayFormat) && value != null)
        {
            DateTime date;
            displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
            // use the format specified in the DisplayFormat attribute to parse the date
            if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
            {
                return date;
            }
            else
            {
                bindingContext.ModelState.AddModelError(
                    bindingContext.ModelName, 
                    string.Format("{0} is an invalid date format", value.AttemptedValue)
                );
            }
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

您将在Application_Start注册:

ModelBinders.Binders.Add(typeof(DateTime), new MyDateTimeModelBinder());

答案 1 :(得分:10)

根据你的评论,我看到你想要的只是一个英文潮流,但有不同的日期格式(纠正我,如果我错了)。

事实是DefaultModelBinder使用服务器的文化设置来表单数据。所以我可以说服务器使用“en-US”文化,但使用不同的日期格式。

你可以在Application_BeginRequest做同样的事情,你就完成了!

protected void Application_BeginRequest()
{
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;
}

<强>的Web.Config

<globalization culture="en-US" />

答案 2 :(得分:0)

将以下代码添加到 global.asax.cs 文件

protected void Application_BeginRequest()  
{        
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());     
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;     
}

并将以下内容添加到<system.web>

下的 web.config
<globalization culture="en-US">;