2015-03-13 46 views
4

我有一個Web API 2 API控制器獲取URL的路由前綴在Razor視圖的ASP.NET Web API

[RoutePrefix("things")] 
public class ThingsController : APIController 
{ 
    [Route("{thingId}", Name="Things.Get")] 
    public Thing Get(string thingId) 
    { 
    //snip... 
    } 
} 

,一切都很好...除了我想通過網址爲路線到一些JS,以便它可以構建的URL請求Things

所以我已經試過

myJavascriptObject.thingUrl = '@Url.Action("Get", "Things", new {area=""})'; 

剃刀的看法,但我得到一個空字符串

我試着給控制器路由一個明確的名稱,並使用

@Url.RouteUrl("Things.Get", new {areas="", thingId="foo"}") b

UT那是一個空字符串了。

我是不是傻了?這應該工作嗎?


更多的嘗試後更新的東西。

在一個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=""條件,那麼我得到一個路線,但與區域名稱中它和路由沒有在它的區域名稱。

?!

回答

3

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 } 
     ); 
    } 

其他一切仍然有效我能得到我想要的路線。

我們肯定沒有在這個項目中使用其他命名空間,我猜測命名空間是在這個解決方案是另一個(它確實用來作爲)的一部分或通過移動它的重構時引入的。

所以,我從來達成任何真正惱人的錯誤的自然結論是:「這是怎麼過的工作?」