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 代代码。
我有以下情况:
[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 代代码。