Пользовательская привязка для данных POST, выбор типа на основе значения - PullRequest
0 голосов
/ 06 ноября 2018

Я использую 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.

...