Связыватель пользовательской модели запускается и запускается, но значение свойства никогда не привязывается - PullRequest
0 голосов
/ 20 сентября 2019

Я написал специальный механизм связывания модели, который будет принимать значение двух текстовых полей (содержащих «Дата» и «Время») и создаст объект DateTime из этих двух значений.

Мой ModelBinder запускается, успешно запускается и корректно анализирует входные данные в допустимый DateTime, и когда мое действие вызывается с моделью, свойство StartDateTime равно ´DateTime.MinValue` вместо того, что было проанализировано вModelBinder.

Моя упрощенная Модель выглядит следующим образом:

[ModelBinder(BinderType = typeof(DateTimeModelBinder))]
[Required]
public DateTime StartDateTime { get; set; }

Это мой ModelBinder , который запускается и работает правильно:

public Task BindModelAsync(ModelBindingContext bindingContext)
{
    if (bindingContext == null)
       throw new ArgumentException(nameof(bindingContext));

    var modelName = bindingContext.ModelName;
    var dateName = $"{modelName}.Date";
    var timeName = $"{modelName}.Time";

    string dateValue = TryGetValue(ref bindingContext, dateName); //function omitted for brevity, but it works!
    string timeValue = TryGetValue(ref bindingContext, timeName);

    bool dateIsValid = DateTime.TryParse(dateValue, out DateTime dateTime);
    bool timeIsValid = TimeSpan.TryParse(timeValue, out TimeSpan timeOfDayResult);

    if (dateIsValid && timeIsValid)
    {
       ModelBindingResult.Success(new DateTime(dateTime.Year, dateTime.Month, dateTime.Day,
                    timeOfDayResult.Hours, timeOfDayResult.Minutes, timeOfDayResult.Seconds));
    }

    return Task.CompletedTask;
}

И затем, когда я ввожу свое Действие , свойство StartDateTime не имеет значения, установленного

public IActionResult Detail(ActivityEditModel model)
{
   var startTime = model.StartDateTime; //property equals DateTime.MinValue, instead of the parsed value from the model binder above
}

1 Ответ

0 голосов
/ 20 сентября 2019

Это было окончательное решение:

В ModelBinder вам нужно установить bindingContext.Result на успех, и вот как я должен был это сделать:

bindingContext.Result = ModelBindingResult.Success(new DateTime(dateTime.Year, dateTime.Month, dateTime.Day,
                    timeOfDayResult.Hours, timeOfDayResult.Minutes, timeOfDayResult.Seconds));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...