Привязать маршрут и значения тела к одной модели по запросу - PullRequest
0 голосов
/ 13 апреля 2020

Можно ли привязать значения из маршрута URL и тела к одной и той же модели во время запроса на публикацию?

Например:

[Route("test")]
public class TestController : ControllerBase
{
    [HttpPost("{valueFromRoute}/post")]
    public IActionResult Post(Model model)
    {
        return new JsonResult(model);
    }
}

public class Model
{
    [FromRoute]
    public string ValueFromRoute { get; set; }

    [FromBody]
    public string ValueFromBody { get; set; }
}

Я бы хотел назвать эту конечную точку следующим образом:

enter image description here

Однако, используя этот код, заполняется только ValueFromRoute:

{
    "valueFromRoute": "some-route-value",
    "valueFromBody": null
}

Я предполагаю, что ответ, вероятно, "нет", и что нужно использовать две отдельные модели, такие как :

[Route("test")]
public class TestController : ControllerBase
{
    [HttpPost("{valueFromRoute}/post")]
    public IActionResult Post([FromRoute] RouteModel routeModel, [FromBody] BodyModel bodyModel)
    {
        return new JsonResult(new 
        { 
            ValueFromRoute = routeModel.ValueFromRoute, 
            ValueFromBody = bodyModel.ValueFromBody
        });
    }
}

public class RouteModel
{
    public string ValueFromRoute { get; set; }
}

public class BodyModel 
{
    public string ValueFromBody { get; set; }
}

Вызов этого точно так же, как на скриншоте выше, работает, как и ожидалось, заполняя оба значения для их соответствующих объектов и выводя следующее:

{
    "valueFromRoute": "some-route-value",
    "valueFromBody": "Some value from body"
}

Итак, я есть потенциальное решение, но это не мое предпочтительное решение. В идеале я хотел бы связать значения маршрута и тела для одной и той же модели, если это возможно.

1 Ответ

0 голосов
/ 14 апреля 2020

Я нашел этот связанный вопрос на GitHub, который помог мне понять, что тело должно быть десериализовано в объект класса, даже если оно содержит только одно свойство, как в моем примере выше.

Решение моего примера выше - просто создать новый класс для десериализации тела и добавить его в мою основную модель, ожидаемую моим методом действия.

[Route("test")]
public class TestController : ControllerBase
{
    [HttpPost("{valueFromRoute}/post")]
    public IActionResult Post(Model model)
    {
        return new JsonResult(model);
    }
}

public class Model
{
    [FromRoute]
    public string ValueFromRoute { get; set; }

    // Map body to simple class object rather than a primitive type
    [FromBody]
    public BodyModel BodyModel { get; set; }
}

public class BodyModel 
{
    public string ValueFromBody { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...