Я пытаюсь разработать пользовательский механизм связывания для некоторых указанных свойств, например свойств типа 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. Хотя я ожидаю, что для каждого свойства его называют. Итак, как я могу иметь связыватель модели для привязки каждого свойства в отдельности? Я знаю, что я могу аннотировать свойства с атрибутами. Но я не хочу ставить некоторые атрибуты на каждое свойство, на которое я хочу воздействовать. Я ищу способ связать свойства с помощью связывателя только с некоторыми настройками при запуске - как выше. Есть идеи, пожалуйста?