DateTime.Parse 无法处理 MVC 自定义活页夹
DateTime.Parse not working on an MVC custom binder
我从 .NET MVC Web 应用程序中的操作中的隐式绑定获取 DateTime。问题是我以 "MM/dd/yyyy" 格式获取日期,而我通过 Ajax 格式 "dd/MM/yyyy".
的查询字符串发送日期
我知道这是使用 GET 协议而非 POST 时 .NET MVC Binder 的一个已知问题,因此我确实实现了一个自定义活页夹来将日期解析为正确的格式。这是代码:
public class SearchVMBinder:DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
SearchVM result = (SearchVM)base.BindModel(controllerContext, bindingContext);
try
{
result.Date = DateTime.Parse(result.Date.ToString(),CultureInfo.GetCultureInfo("es-ES"));
}
catch(Exception e)
{
NLog.LogManager.GetCurrentClassLogger().Error("Error al hacer el Bind específico de SearchVM. ", e);
}
return result;
}
}
但是,使用该代码,Parse 无法正常工作,它什么都不做。我正在用“01/04/2014 11:37:00”(四月)之类的日期对其进行测试,我得到的是 "result.Date" 日期“04/01/2014 11:37:00” (一月),解析前后。
所以,问题是:为什么方法 "DateTime.Parse" 没有正确解析日期?
更新:
这是 SearchVM 的代码:
[ModelBinder(typeof(SearchVMBinder))]
public class SearchVM
{
public DateTime Date { get; set; }
public string StudyCaseNumber { get; set; }
public string PatientNumber { get; set; }
public string PatientName { get; set; }
public string PatientFamilyName { get; set; }
public string PatientMothersMaidenName { get; set; }
public string DoctorName { get; set; }
public string RoomName { get; set; }
public E_OrderedBy OrderBy { get; set; }
}
这里是控制器动作的header:
public ActionResult ListSearch(SearchVM searchFilter)
谢谢。
开始吧:
尝试 post/send 您的 DateTime 作为 UTC 字符串:
您可以这样转换:
DateTime startdate = TimeZoneInfo.ConvertTimeToUtc(input.startdate.Value); //Converting to UTC time from local time
希望对您有所帮助;)
像这样的东西会起作用
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var testFormat = bindingContext.ModelMetadata.DisplayFormatString;
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (!string.IsNullOrEmpty(testFormat) && value != null)
{
DateTime testDate;
testFormat = testFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
// use the format specified in the testFormat attribute to parse the date
if(DateTime.TryParseExact(value.AttemptedValue, testFormat, new System.Globalization.CultureInfo("es-ES"), DateTimeStyles.None, out testDate);)
{
return testDate;
}
else
{
//if you want allow nulls
//date = DateTime.Now.Date;
//return date;
bindingContext.ModelState.AddModelError(
bindingContext.ModelName,
string.Format("{0} is an invalid date format", value.AttemptedValue)
);
}
}
return base.BindModel(controllerContext, bindingContext);
}
您的代码有效。
查看此问题的最佳答案:Convert DateTime from English to Spanish
你说:
But, with that code the Parse is not working, it just does nothing.
I'm testing it with a date like "01/04/2014 11:37:00" (april) and i'm
getting at the "result.Date" the date "04/01/2014 11:37:00" (january),
before and afert parsing.
这是一种非常特殊的不起作用 - 那种是区域设置差异的结果。您已使用 "es-ES" 格式。
https://www.bjelic.net/2011/01/26/coding/formatting-date-time-currency-in-various-cultures/
result.Date =
DateTime.Parse(result.Date.ToString(),
CultureInfo.GetCultureInfo("es-ES"));
结果日期是根据您的“01/04/2014 11:37:00”并且 es-ES
语言环境是 dd/MM/yyyy,因此由于您 目前正在使用english 它进行转换。
好的,由于某种原因,"Parse" 方法没有正确解释传入的 DateTime 格式,即 "MM/dd/yyyy H:mm:ss",所以我不得不使用 "ParseExact" 方法来指定它。
现在,这非常适合西班牙文化信息:
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
SearchVM result = (SearchVM)base.BindModel(controllerContext, bindingContext);
try
{
if (result != null)
{
if (result.NullableDate != null)
{
result.NullableDate = DateTime.ParseExact(result.NullableDate.ToString(), "MM'/'dd'/'yyyy H:mm:ss", new CultureInfo("es-ES"));
}
}
}
catch(Exception e)
{
NLog.LogManager.GetCurrentClassLogger().Error("Error al hacer el Bind específico de SearchVM. ", e);
}
return result;
}
我从 .NET MVC Web 应用程序中的操作中的隐式绑定获取 DateTime。问题是我以 "MM/dd/yyyy" 格式获取日期,而我通过 Ajax 格式 "dd/MM/yyyy".
的查询字符串发送日期我知道这是使用 GET 协议而非 POST 时 .NET MVC Binder 的一个已知问题,因此我确实实现了一个自定义活页夹来将日期解析为正确的格式。这是代码:
public class SearchVMBinder:DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
SearchVM result = (SearchVM)base.BindModel(controllerContext, bindingContext);
try
{
result.Date = DateTime.Parse(result.Date.ToString(),CultureInfo.GetCultureInfo("es-ES"));
}
catch(Exception e)
{
NLog.LogManager.GetCurrentClassLogger().Error("Error al hacer el Bind específico de SearchVM. ", e);
}
return result;
}
}
但是,使用该代码,Parse 无法正常工作,它什么都不做。我正在用“01/04/2014 11:37:00”(四月)之类的日期对其进行测试,我得到的是 "result.Date" 日期“04/01/2014 11:37:00” (一月),解析前后。
所以,问题是:为什么方法 "DateTime.Parse" 没有正确解析日期?
更新:
这是 SearchVM 的代码:
[ModelBinder(typeof(SearchVMBinder))]
public class SearchVM
{
public DateTime Date { get; set; }
public string StudyCaseNumber { get; set; }
public string PatientNumber { get; set; }
public string PatientName { get; set; }
public string PatientFamilyName { get; set; }
public string PatientMothersMaidenName { get; set; }
public string DoctorName { get; set; }
public string RoomName { get; set; }
public E_OrderedBy OrderBy { get; set; }
}
这里是控制器动作的header:
public ActionResult ListSearch(SearchVM searchFilter)
谢谢。
开始吧:
尝试 post/send 您的 DateTime 作为 UTC 字符串: 您可以这样转换:
DateTime startdate = TimeZoneInfo.ConvertTimeToUtc(input.startdate.Value); //Converting to UTC time from local time
希望对您有所帮助;)
像这样的东西会起作用
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var testFormat = bindingContext.ModelMetadata.DisplayFormatString;
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (!string.IsNullOrEmpty(testFormat) && value != null)
{
DateTime testDate;
testFormat = testFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
// use the format specified in the testFormat attribute to parse the date
if(DateTime.TryParseExact(value.AttemptedValue, testFormat, new System.Globalization.CultureInfo("es-ES"), DateTimeStyles.None, out testDate);)
{
return testDate;
}
else
{
//if you want allow nulls
//date = DateTime.Now.Date;
//return date;
bindingContext.ModelState.AddModelError(
bindingContext.ModelName,
string.Format("{0} is an invalid date format", value.AttemptedValue)
);
}
}
return base.BindModel(controllerContext, bindingContext);
}
您的代码有效。
查看此问题的最佳答案:Convert DateTime from English to Spanish
你说:
But, with that code the Parse is not working, it just does nothing. I'm testing it with a date like "01/04/2014 11:37:00" (april) and i'm getting at the "result.Date" the date "04/01/2014 11:37:00" (january), before and afert parsing.
这是一种非常特殊的不起作用 - 那种是区域设置差异的结果。您已使用 "es-ES" 格式。
https://www.bjelic.net/2011/01/26/coding/formatting-date-time-currency-in-various-cultures/
result.Date =
DateTime.Parse(result.Date.ToString(),
CultureInfo.GetCultureInfo("es-ES"));
结果日期是根据您的“01/04/2014 11:37:00”并且 es-ES
语言环境是 dd/MM/yyyy,因此由于您 目前正在使用english 它进行转换。
好的,由于某种原因,"Parse" 方法没有正确解释传入的 DateTime 格式,即 "MM/dd/yyyy H:mm:ss",所以我不得不使用 "ParseExact" 方法来指定它。
现在,这非常适合西班牙文化信息:
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
SearchVM result = (SearchVM)base.BindModel(controllerContext, bindingContext);
try
{
if (result != null)
{
if (result.NullableDate != null)
{
result.NullableDate = DateTime.ParseExact(result.NullableDate.ToString(), "MM'/'dd'/'yyyy H:mm:ss", new CultureInfo("es-ES"));
}
}
}
catch(Exception e)
{
NLog.LogManager.GetCurrentClassLogger().Error("Error al hacer el Bind específico de SearchVM. ", e);
}
return result;
}