Почему nameof не работает с оператором возврата CreationAtAction - PullRequest
0 голосов
/ 21 мая 2019

Я разрабатываю веб-API с использованием .NET Core , когда я отправляю сообщение или обновление в мой веб-интерфейс, я возвращаю ресурс.Для этого в конце каждого метода я использую метод CreatedAtAction, где первым параметром является имя действия.

Когда я использую жестко закодированное имя действия, например, CreatedAtAction("GetBook", [...], оно работает.Но когда я использую CreatedAtRoute(nameof(GetBook), [...], я получил сообщение о том, что ни один маршрут не совпадает.Есть ли конкретная причина для этого?

Ответы [ 3 ]

1 голос
/ 21 мая 2019

Похоже, вы перепутали методы CreatedAt*Action* и CreatedAt*Route*. nameof(GetBook) обязательно должен вернуть "GetBook".

0 голосов
/ 22 мая 2019

CreateAtRoute - это вспомогательный метод, который наследует от ControllerBase . CreateAtRoute() делает , просто возвращая новый CreatedAtRouteResult (routeName, routeValues, значение) . Темной магии нет вообще:

/// <summary>
/// Creates a <see cref="CreatedAtRouteResult"/> object that produces a <see cref="StatusCodes.Status201Created"/> response.
/// </summary>
/// <param name="routeName">The name of the route to use for generating the URL.</param>
/// <param name="routeValues">The route data to use for generating the URL.</param>
/// <param name="value">The content value to format in the entity body.</param>
/// <returns>The created <see cref="CreatedAtRouteResult"/> for the response.</returns>
[NonAction]
public virtual CreatedAtRouteResult CreatedAtRoute(string routeName, object routeValues, object value)
=> new CreatedAtRouteResult(routeName, routeValues, value);

Метод CreateAtRoute часто используется в ApiController, а третий параметр будет использоваться в качестве содержимого ответа. Допустим, метод действия:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{

    [HttpGet("{id}", Name = "HelloDetails")]
    public IActionResult GetDetail(int id)
    {
        var result = new MyItem() {
            Id=id,
            ItemName="sherry"
        }; 

        return new JsonResult(result);
    }

    [HttpPost]
    public async Task<IActionResult> Create([FromBody] MyItem item)
    {
        if (item == null)
        {
            return BadRequest();
        }

        return CreatedAtRoute("HelloDetails", new { id = item.Id }, item);
    }

Используйте Почтальон для проверки, результат - 201 ответ. Тело ответа содержит сведения о сущности, которую мы создали, а заголовок Location ответа содержит URI для сущности.

enter image description here

enter image description here

Вы также можете посмотреть эту ссылку

0 голосов
/ 21 мая 2019

Ссылка по ссылке: https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-2.2 Он показывает CreatedAtAction (nameof (GetBook), [...]) должно работать.

...