Пользовательский простой тип модели Binder не работает для обрезки строк - PullRequest
2 голосов
/ 26 апреля 2019

Я пытаюсь реализовать связывание модели обрезки строк в ядре .net 2.1.Что я сделал, так это то, что я создал привязку пользовательской модели, создал поставщика для этого и зарегистрировал ее в классе запуска.

Я ожидаю, что если какая-либо модель имеет строковое свойство, она обрезает значение и устанавливаетв модельном переплете.Я нацеливаюсь только на строки, поэтому я проверил в поставщике, который возвращает связыватель, только если тип модели является строкой.

Но метод связывания модели BindModelAsync никогда не вызывается, хотя.

Я пропустил какой-то важный кусок кода?Любая помощь будет принята с благодарностью.

TrimmingModelBinder

public class TrimmingModelBinder  : IModelBinder
   {
        private readonly IModelBinder FallbackBinder;

    /// <summary>
    /// 
    /// </summary>
    /// <param name="fallbackBinder"></param>        
    public TrimmingModelBinder(IModelBinder fallbackBinder)
    {
        FallbackBinder = fallbackBinder ?? throw new ArgumentNullException(nameof(fallbackBinder));
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="bindingContext"></param>
    /// <returns></returns>
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueProviderResult != null &&
          valueProviderResult.FirstValue is string str &&
          !string.IsNullOrEmpty(str))
        {
            bindingContext.Result = ModelBindingResult.Success(str.Trim());
            return Task.CompletedTask;
        }
        return FallbackBinder.BindModelAsync(bindingContext);
    }
}

TrimmingModelBinderProvider

  public class TrimmingModelBinderProvider  : IModelBinderProvider
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="context"> context </param>
    /// <returns></returns>
    public IModelBinder GetBinder(ModelBinderProviderContext context)
        {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }
        if (!context.Metadata.IsComplexType && context.Metadata.ModelType == typeof(string))
        {
            var loggerFactory = context.Services.GetRequiredService<ILoggerFactory>();
            return new TrimmingModelBinder(new SimpleTypeModelBinder(context.Metadata.ModelType, loggerFactory));
        }
        return null;
    }
}

Запуск.CS

services
            .AddMvcCore()
            .AddMvcOptions(options =>
            {
                options.Filters.Add<ServiceClientExceptionFilter>();
                var simpleTypeModelBinderProvider = options.ModelBinderProviders.First(x => x.GetType() == typeof(SimpleTypeModelBinderProvider));
                var index = options.ModelBinderProviders.IndexOf(simpleTypeModelBinderProvider);
                options.ModelBinderProviders.Insert(0, new TrimmingModelBinderProvider());
            })
...