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

时间:2016-02-10 23:24:33

标签: asp.net-mvc-5.2

我有以下情况:

[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中的错误吗?有没有办法影响它?

1 个答案:

答案 0 :(得分:1)

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

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

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