添加aspnet-api-versioning可防止UrlHelper在Razor Pages请求中生成Controller API路由

时间:2018-05-08 23:00:30

标签: razor asp.net-core-mvc urlhelper api-versioning

我可以创建一个文件>新的aspnetcore API项目,并使用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脚手架创建一个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方法现在返回null。我已经尝试更新提供给RouteUrl方法的路由数据,以便我传递硬编码版本(用于测试),但它也不起作用。

new { version = 1, Id = index }

是否需要在api版本控制包上进行任何配置以支持页面?我们有剃刀页面,我们想要生成用于在页面中呈现的API路由,但它似乎不起作用。

0 个答案:

没有答案