我的模型中有DateTime字段。我从前端发送日期的格式是d.m.Y H:i
。它被解析好了。
但是当我设置美国日期格式从前端发送并通过在我的控制器操作之前运行的en-US
方法中键入Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
来将文化设置为OnActionExecuting
时,它说该日期是在if (ModelState.IsValid)
无效。
我的问题是在Asp.Net框架中设置了默认格式为d.m.Y H:i
的位置,如何更改默认格式?粘合剂是否考虑了文化,或者总是d.m.Y H:i
?
答案 0 :(得分:1)
我解决了与我添加到项目中的custom data binder相同的问题。
首先,我添加新课程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());
}
答案 1 :(得分:1)
感谢Vadim提供的解决方案,但我发现了正在发生的事情并在没有自定义日期绑定的情况下解决了这个问题。
问题是参数绑定是在放置OnActionExecuting
的{{1}}方法之前完成的,因此在完成绑定时,文化仍然是默认的。默认文化是在Windows(系统区域设置)中设置的文化。
我将Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
放在<globalization culture="en-US"/>
<system.web>
中进行了更改。
所以现在绑定器正确解析美国日期。