Я использую Asp.NET MVC Core 2 для реализации REST WebAPI. В моем контроллере у меня есть метод, который принимает запрос POST
, который выглядит следующим образом:
[HttpPost("Configuration")]
public IActionResult Configuration([FromBody] BridgeConfiguration data)
{
...
}
Это работает, но проблема в том, что класс BridgeConfiguration
, который вы видите в сигнатуре метода, является базовым классом, и я хотел бы на самом деле выбрать соответствующий производный класс для привязки на основе одного из значения во входящем объекте.
Я читал, что это можно сделать с помощью пользовательского связывателя модели, но у меня возникают проблемы с его реализацией. Я сделал следующее: я изменил метод контроллера на:
[HttpPost("Configuration")]
public IActionResult Configuration([ModelBinder(typeof(BridgeConfigurationModelBinder))] BridgeConfiguration data)
{
...
}
и попытался реализовать связующее для модели:
public class BridgeConfigurationModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var nameProp = bindingContext.ModelMetadata.Properties["name"]; //Exists and contains all the proper info :)
var nameVal = bindingContext.ValueProvider.GetValue("name"); //Returns empty value :(
//how do I get the value of the "name" field???
return Task.CompletedTask;
}
}
Проблема, с которой я столкнулся, заключается в том, что, как вы можете видеть из комментариев, даже если в метаданных нужное поле определено правильно, оно не имеет значения. ValueProvider
всегда возвращает пустой.
Что я здесь не так делаю?
Если это имеет смысл, тело моего почтового запроса выглядит примерно так:
{
name: "somename",
foo: "bar",
...
}
Ничего странного, просто JSON.