Реализация IModelBinder для сбора строк - PullRequest
0 голосов
/ 07 мая 2019

На самом деле в моем проекте .NET Core я использую простое средство привязки моделей для обрезки входной строки

public class StringModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException(nameof(bindingContext));

        ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueProviderResult != ValueProviderResult.None)
        {
            bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);

            string valueAsString = string.IsNullOrWhiteSpace(valueAsString) ? null : valueAsString.Trim();

            bindingContext.Result = ModelBindingResult.Success(valueAsString);
        }

        return Task.CompletedTask;
    }
}

Я использую его через IModelBinderProvider, и он отлично работает при вводе типа string. Однако я заметил, что он не запускается, когда на входе у меня есть коллекция строк, как это

public IActionResult CollectionTrimTest([FromBody] List<string> values)

Чтобы выполнить это, я думаю, что я должен использовать что-то вроде

if (context.Metadata.IsCollectionType)
    return new BinderTypeModelBinder(typeof(CollectionModelBinder));

но я действительно не знаю, как реализовать CollectionModelBinder для обрезки результата на основе коллекции строк. Централизация логики обрезки между StringModelBinder и CollectionModelBinder, конечно, была бы очень полезна.

1 Ответ

0 голосов
/ 08 мая 2019

Решено, кажется, [FromBody] должен требовать JsonConverter. Больше информации на https://stackoverflow.com/a/54663595/4963176

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...