У меня есть проект WebAPI, который принимает строки даты ISO внутри входной модели. Я анализировал их, используя DateTimeOffset?
. Я хочу изгнать дату и время BCL из своего проекта, поэтому я хочу найти способ напрямую связать эти строки с Instant
.
public class MyInputModel
{
public DateTimeOffset? OldTime { get; set; }
public Instant NewTime { get; set; }
}
Пример модели ввода JSON выглядит следующим образом:
{
"oldtime":"2016-01-01T12:00:00Z",
"newtime":"2016-01-01T12:00:00Z"
}
И мой код контроллера:
[HttpPost]
public async Task<IActionResult> PostTimesAsync([FromBody]MyInputModel input)
{
Instant myOldTime = Instant.FromDateTimeUtc(input.oldTime.Value.UtcDateTime);
Instant myNewTime = input.newTime; // This cannot be used with ISO date strings.
}
Я попытался создать пользовательскую привязку модели следующим образом. Это работает для моделей в строке запроса, но не для моделей в теле запроса POST. Как привязать ввод даты в строковом формате ISO 8601 к NodaTime Instant?
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (!String.IsNullOrWhiteSpace(bindingContext.ModelName) &&
bindingContext.ModelType == typeof(Instant?) &&
bindingContext.ValueProvider.GetValue(bindingContext.ModelName) != null)
{
Instant? value;
var val = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName).FirstValue as string;
if (String.IsNullOrWhiteSpace(val))
{
bindingContext.Result = ModelBindingResult.Failed();
return Task.FromResult(0);
}
else if (InstantExtensions.TryParse(val, out value))
{
bindingContext.Result = ModelBindingResult.Success(value);
return Task.FromResult(0);
}
else
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName,
"The date is invalid.");
}
}
bindingContext.Result = ModelBindingResult.Failed();
return Task.FromResult(0);
}
public static bool TryParse(string value, out Instant? result)
{
result = null;
// If this is date-only, add Utc Midnight to the value.
if (value.Length.Equals(10))
{
value += "T00:00:00Z";
}
// Trim milliseconds if present
var decimalPointIndex = value.IndexOf('.');
if (decimalPointIndex > 0)
{
value = value.Substring(0, decimalPointIndex) + "Z";
}
// Attempt to parse
var parseResult = InstantPattern.GeneralPattern.Parse(value);
if (parseResult.Success)
{
result = parseResult.Value;
return true;
}
return false;
}
Type
вы зарегистрировали свою модель подшивки? - person bot_insane   schedule 01.08.2016[ModelBinder(BinderType = typeof(InstantModelBinder))]Instant? time = null)
- person 08Dc91wk   schedule 01.08.2016ModelBinders.Binders.Add(typeof(Instant?), new InstantModelBinder());
вGlobal.asax.cs
Или, может быть, без вопросительного знака, как я вижу вMyInputModel
, он не может быть обнулен. - person bot_insane   schedule 01.08.2016Startup.cs
файл. В функцииConfiguration
вот так:public void Configuration(IAppBuilder app) { ModelBinders.Binders.Add(typeof(Instant?), new InstantModelBinder()); ... }
- person bot_insane   schedule 01.08.2016MVC
, пожалуйста, посмотрите мой ответ. - person bot_insane   schedule 01.08.2016