我在从QueryString绑定日期时遇到了一些麻烦:
我有以下型号
public class QueryParms
{
public DateTime Date { get; set; }
}
以下控制器操作:
public ActionResult Search( QueryParms query );
我有一个表单,有一个字段,我可以输入日期。如果表单是FormMethod.Post,一切都很好,我的日期正确绑定到我的模型。
如果表单是FormMethod.Get,它将不再起作用。日期保留为默认值(01/01/0001)
我认为这是一个文化问题: 当我查看值提供程序时,FormValueProvider为我的日期设置了一个culture属性:{fr-FR}。 QueryStringValueProvider没有设置culture属性。
有没有办法设置这个属性?
答案 0 :(得分:1)
这似乎是设计上的:
http://www.pagedesigners.co.nz/2009/12/asp-net-mvc-datetime-binding-and-culture-unaware-urls/
解决方案(来自:CultureInfo issue with Modelbinding double in asp.net-mvc(2))是写一个新的模型绑定器:
public class DateTimeModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var culture = GetUserCulture(controllerContext);
string value = bindingContext
.ValueProvider
.GetValue(bindingContext.ModelName)
.ConvertTo(typeof(string)) as string;
if (string.IsNullOrEmpty(value))
{
return null;
}
return DateTime.Parse(value, culture.DateTimeFormat);
}
public CultureInfo GetUserCulture(ControllerContext context)
{
var request = context.HttpContext.Request;
if (request.UserLanguages == null || request.UserLanguages.Length == 0)
return CultureInfo.CurrentUICulture;
return new CultureInfo(request.UserLanguages[0]);
}
}