日期绑定器区域性

本文关键字:区域性 绑定 日期 | 更新日期: 2023-09-27 18:32:00

我的模型中有日期时间字段。我从前端发送日期的格式是 d.m.Y H:i .并且解析正常。

但是当我将美国日期格式设置为从前端发送并通过在我的控制器操作之前运行的方法中键入Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US") OnActionExecuting将文化设置为en-US时,它说日期在if (ModelState.IsValid)无效。

我的问题是 Asp.Net 框架中默认格式的哪个位置设置d.m.Y H:i以及如何更改该默认格式?活页夹是考虑文化还是总是d.m.Y H:i

日期绑定器区域性

我用添加到项目中的自定义数据活页夹解决了同样的问题。

首先,我添加新的类DateTimeModelBinder

public class DateTimeModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value != null)
        {
            DateTime time;
            // here you can add your own logic to parse input value to DateTime
            //if (DateTime.TryParseExact(value.AttemptedValue, "d.m.Y H:i", CultureInfo.InvariantCulture, DateTimeStyles.None, out time))
            if (DateTime.TryParse(value.AttemptedValue, Culture.Ru, DateTimeStyles.None, out time))
            {
                return time;
            }
            else
            {
                bindingContext.ModelState.AddModelError(bindingContext.ModelName,
                    string.Format("Date {0} is not in the correct format", value.AttemptedValue));
            }
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

然后我在应用程序启动的Global.asax.cs中添加我的 bindeg:

protected void Application_Start(object sender, EventArgs eventArgs)
{
    ModelBinders.Binders.Add(typeof(DateTime), new ateTimeModelBinder());
}

感谢瓦迪姆的解决方案,但我发现了正在发生的事情并在没有自定义日期活页夹的情况下解决了它。

问题是参数绑定是在我放置Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")OnActionExecuting方法之前完成的,因此在完成绑定时,文化仍然是默认的。默认区域性是在Windows(系统区域设置)中设置的区域性。

我通过将<globalization culture="en-US"/>放入<system.web> Web.config来更改它。

所以现在活页夹正确解析美国日期。