我有以下情况:
[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中的错误吗?有没有办法影响它?
答案 0 :(得分:1)
生成URL时,最好的选择是始终使用路由名称,因为这样您就不会深入了解用于选择将用于生成URL的路由的算法的细微之处。
我的建议是,如果您不使用Url.Action,而是使用Url.RouteUrl,它允许您指定应该用于构建URL的路由的名称。
通过始终使用路由名称,您还可以使代码对更改更加健壮,例如,您可以添加新路由,而不必担心它们可能会破坏现有的URL生成代码。