在 Razor 视图中为 ASP.NET WEB API 中的路由前缀获取 URL
Get URL for Route Prefix in ASP.NET WEB API in Razor view
我有一个 Web API 2 API 控制器
[RoutePrefix("things")]
public class ThingsController : APIController
{
[Route("{thingId}", Name="Things.Get")]
public Thing Get(string thingId)
{
//snip...
}
}
一切都很好...除了我想将该路由的 URL 传递给某些 JS,以便它可以构造 URLs 来请求 Things
所以我试过剃刀视图
myJavascriptObject.thingUrl = '@Url.Action("Get", "Things", new {area=""})';
但我得到一个空字符串
我试过给控制器路由一个明确的名称并使用
@Url.RouteUrl("Things.Get", new {areas="", thingId="foo"}")
b
但这也是一个空字符串。
我是不是傻了?这应该有效吗?
经过更多尝试后更新。
在 MVC 控制器上(我需要知道 API 控制器路由)
var something = Url.Action("Get", "Things", new {area = ""});
var somethingWithId = Url.Action("Get", "Things", new { area = "", siteId = "fakeId" });
var somethingElse = Url.RouteUrl(new {Action = "Get", Controller = "Things", Area = ""});
var somethingElseWithId = Url.RouteUrl(new { Action = "Get", Controller = "Things", Area = "", siteId = "fakeId" });
这些都是空的。
如果我删除 area=""
条件,那么我会得到一条路线,但其中包含区域名称,而路线中没有区域名称。
?!
TL;DR - 如果有什么东西很奇怪,请在新环境中将其钉住
在非常遥远的情况下在这里留下答案可以帮助其他人。
有人向我指出这对他们有用,我创建了一个新的 MVC 和 API 项目并查看了默认路由。
我们的看起来像这样:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "home",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new [] { "Another.Project.Controllers" }
);
}
WAT?
我用默认路由配置替换了它:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
其他一切仍然有效并且我可以得到我想要的路线。
我们绝对没有在这个项目中使用其他名称空间,我猜名称空间是在这个解决方案是另一个解决方案的一部分(它曾经是)或者通过重构移动它时引入的.
因此,对于任何非常烦人的错误,我都得出了自然的结论:"How did this ever work?!"
我有一个 Web API 2 API 控制器
[RoutePrefix("things")]
public class ThingsController : APIController
{
[Route("{thingId}", Name="Things.Get")]
public Thing Get(string thingId)
{
//snip...
}
}
一切都很好...除了我想将该路由的 URL 传递给某些 JS,以便它可以构造 URLs 来请求 Things
所以我试过剃刀视图
myJavascriptObject.thingUrl = '@Url.Action("Get", "Things", new {area=""})';
但我得到一个空字符串
我试过给控制器路由一个明确的名称并使用
@Url.RouteUrl("Things.Get", new {areas="", thingId="foo"}")
b
但这也是一个空字符串。
我是不是傻了?这应该有效吗?
经过更多尝试后更新。
在 MVC 控制器上(我需要知道 API 控制器路由)
var something = Url.Action("Get", "Things", new {area = ""});
var somethingWithId = Url.Action("Get", "Things", new { area = "", siteId = "fakeId" });
var somethingElse = Url.RouteUrl(new {Action = "Get", Controller = "Things", Area = ""});
var somethingElseWithId = Url.RouteUrl(new { Action = "Get", Controller = "Things", Area = "", siteId = "fakeId" });
这些都是空的。
如果我删除 area=""
条件,那么我会得到一条路线,但其中包含区域名称,而路线中没有区域名称。
?!
TL;DR - 如果有什么东西很奇怪,请在新环境中将其钉住
在非常遥远的情况下在这里留下答案可以帮助其他人。
有人向我指出这对他们有用,我创建了一个新的 MVC 和 API 项目并查看了默认路由。
我们的看起来像这样:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "home",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new [] { "Another.Project.Controllers" }
);
}
WAT?
我用默认路由配置替换了它:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
其他一切仍然有效并且我可以得到我想要的路线。
我们绝对没有在这个项目中使用其他名称空间,我猜名称空间是在这个解决方案是另一个解决方案的一部分(它曾经是)或者通过重构移动它时引入的.
因此,对于任何非常烦人的错误,我都得出了自然的结论:"How did this ever work?!"