Я пытаюсь реализовать связывание модели обрезки строк в ядре .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());
})