Добавление aspnet-api-versioning не позволяет UrlHelper генерировать маршруты API контроллера в запросе Razor Pages. - PullRequest
0 голосов
/ 09 мая 2018

Я могу создать файл-> новый проект API aspnetcore и использовать IUrlHelper для создания маршрута по имени без каких-либо проблем.

[Route("api/[controller]")]
public class ValuesController : Controller
{
    public const string GetValues = "GetValues";
    public const string GetValuesById = "GetValuesById";
    public static string[] Values = new[] { "value1", "value2", "value3", };

    // GET api/values
    [HttpGet(Name = GetValues)]
    public IEnumerable<object> Get()
    {
        var result = new List<object>();
        for(int index = 0; index < Values.Length - 1; index++)
        {
            string routeForElement = this.Url.RouteUrl(GetValuesById, new { Id = index });
            result.Add(new { Value = Values[index], Route = routeForElement });
        }

        return result;
    }

    // GET api/values/5
    [HttpGet("{id}", Name = GetValuesById)]
    public string Get(int id)
    {
        if (id > (Values.Length - 1))
        {
            return "Invalid Id";
        }

        return Values[id];
    }
}

Когда ответ отправляется обратно, у меня правильно есть маршруты, которые я создал:

 [
  {
    "value": "value1",
    "route": "/api/v1/Values/0"
  },
  {
    "value": "value2",
    "route": "/api/v1/Values/1"
  },
  {
    "value": "value3",
    "route": "/api/v1/Values/2"
  }
]

Затем я могу использовать Visual Studio Scaffolding для создания страницы Razor и продолжать генерировать тот же маршрут без каких-либо проблем на моей странице Razor:

Модель

public class IndexModel : PageModel
{
    public List<string> Routes { get; set; } = new List<string>();

    public void OnGet()
    {
        for (int index = 0; index < ValuesController.Values.Length; index++)
        {
            string routeForElement = this.Url.RouteUrl(ValuesController.GetValuesById, new { Id = index });
            Routes.Add(routeForElement);
        }
    }
}

Страница

@page
@model UrlHelperWithPages.Pages.IndexModel
@foreach(string route in Model.Routes)
{
    <h4>@route</h4>
}

Это делает маршруты без проблем.

Если я добавлю пакет aspnet-api-versioning nuget и настроу его службы:

services.AddApiVersioning();

Мой контроллер API продолжает работать со следующей модификацией. Любой запрос, предназначенный для этого контроллера, имеет правильно сформированные маршруты.

[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class ValuesController : Controller

Однако Razor Pages перестает работать, когда мы пытаемся сгенерировать маршрут из запроса Razor Pages. Метод RouteUrl теперь возвращает ноль. Я попытался обновить данные маршрута, предоставленные для метода RouteUrl, чтобы я передал жестко запрограммированную версию (для тестирования), и она тоже не работает.

new { version = 1, Id = index }

Есть ли какая-либо конфигурация, которая должна произойти в пакете управления версиями API для поддержки страниц? У нас есть бритвенные страницы, которые мы хотим сгенерировать API-маршрутами для рендеринга на странице, но, похоже, это не работает.

...