Url.Action 使用 RouteAttribute 时提供了错误的结果

Url.Action delivers wrong result when RouteAttribute is used

我有以下情况:

[RoutePrefix("MvcApi/MyData")]
public class MyDataController : Controller
{
    [Route("GetAsSelectionListBySiteId/{siteId}")]
    public async Task<ActionResult> GetAsSelectionListBySiteId(int siteId)
    {
        var items = await IoC.Instance.GetInstance<IDataProvider>().GetBySiteIdAsync(ParallelDataAccessor, siteId);
        return Json(items.Select(s => new KeyValuePair<int, string>(s.Identifier, s.DisplayName)).ToArray(), JsonRequestBehavior.AllowGet);
    }

    public static class Routes
    {
        public static RouteValueDictionary GetAsSelectionListBySiteId(int siteId)
        {
            return new RouteValueDictionary()
                .AddReturn(nameof(siteId), siteId)
                .AddReturn("area", "MvcApi");
        }
    }
}

当我使用

@Url.Action("GetAsSelectionListBySiteId", "MyData", MyDataController.Routes.GetAsSelectionListBySiteId(5))

在视图中这将呈现为

MvcApi/MyData/GetAsSelectionListBySiteId?siteId=5 <- 404 error

当我确实需要这样的时候

MvcApi/MyData/GetAsSelectionListBySiteId/5 <- 200 ok

这是@Url.Action中的错误吗?有办法影响吗?

生成 URL 时,您最好的选择是始终使用路由名称,因为这样您就不会了解用于 select 将用于生成的路由的算法的微妙之处URL.

我的建议是不要使用 Url.Action 而是使用 Url.RouteUrl,它允许您指定应该用于构造 URL 的路由名称。

通过始终使用路由名称,您还可以使您的代码对更改更加健壮,例如,您可以添加新路由而不必担心它们可能会破坏现有的 URL 代代码。