Пользовательское связующее модель не влияет на свойства в ASP. NET CORE 3.1 - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь разработать пользовательский механизм связывания для некоторых указанных свойств, например свойств типа string. У меня есть этот простой связыватель и поставщик:

public class CustomModelBinderProvider : IModelBinderProvider {
    public IModelBinder GetBinder(ModelBinderProviderContext context) {
        if (context.Metadata.ModelType == typeof(string)) 
            return new BinderTypeModelBinder(typeof(CustomModelBinder));
        return null;
    }
}

public class CustomModelBinder : IModelBinder {
    public Task BindModelAsync(ModelBindingContext bindingContext) {
        // blah blah blah
        return Task.CompletedTask;
    }
}  

И я зарегистрировал связующее при запуске:

services.AddMvc(o => {o.ModelBinderProviders.Insert(0, new CustomModelBinderProvider());})
        .AddControllersAsServices();

Вот простая модель и действие, с которым я тестирую:

public class Man {
    public string Phone { get; set; }
    public int Id { get; set; }
}

[ApiController]
[Route("[controller]/[action]")]
public class MyController : ControllerBase {

    [HttpPost]
    public object Des(Man model) {
        return new {Me = "amiry", Man = model};
    }
}

Но когда я публикую модель, например,

{
    "id": 1,
    "phone": "some string"
}

в действии, CustomModelBinderProvider.GetBinder получает удар один раз, а значение context.Metadata.ModelType всегда равно Man class. Хотя я ожидаю, что для каждого свойства его называют. Итак, как я могу иметь связыватель модели для привязки каждого свойства в отдельности? Я знаю, что я могу аннотировать свойства с атрибутами. Но я не хочу ставить некоторые атрибуты на каждое свойство, на которое я хочу воздействовать. Я ищу способ связать свойства с помощью связывателя только с некоторыми настройками при запуске - как выше. Есть идеи, пожалуйста?

...