2013-03-11 24 views
4

我試過一切,但看起來我只是沒有得到它。我WebApiConfig.cs看起來是這樣的:如何使{控制器}/{id}/{action}在MVC4中工作?

config.Routes.MapHttpRoute(
    "Default", 
    "api/{controller}/{id}", 
    new { id = RouteParameter.Optional }); 

config.Routes.MapHttpRoute(
    "AccountVerification", 
    "api/{controller}/{id}/{action}", 
    null, 
    new { controller = "Account" }); 

我的控制器看起來像這樣:

public class AccountController : ApiController { 
    public HttpResponseMessage GetByKey(Guid accountID) { 
     ... 
    } 

    [HttpGet] 
    [ActionName("Verify")] 
    public HttpResponseMessage VerifyAccount(Guid accountID) { 
     ... 
    } 
} 

這些方法應該得到一擊與以下網址:

GET /api/account          - WORKS 
GET /api/account/00000000-0000-0000-000000000001  - WORKS 
GET /api/account/00000000-0000-0000-000000000001/verify - DOESNT WORK 

我已經嘗試了很多東西;我肯定在這裏做錯了...請幫助。

回答

2

首先,如果你想用假GUID來測試,以及具有可選的Guid參數,它們必須是空的參數的(假的GUID將被反序列爲空):

public class AccountController : ApiController 
{ 
    public HttpResponseMessage GetByKey(Guid? accountID) 
    { 
     throw new Exception("GetByKey " + (accountID.HasValue ? accountID.ToString() : "NULL")); 
    } 

    [System.Web.Http.HttpGet] 
    [System.Web.Http.ActionName("Verify")] 
    public HttpResponseMessage VerifyAccount(Guid? accountID) 
    { 
     throw new Exception("VerifyAccount "+(accountID.HasValue?accountID.ToString():"NULL")); 
    } 
} 

那麼,你的映射應:

  • 使用最具體的路線第一
  • 使用正確的參數名稱
  • 使用正確的默認值對於行動

    config.Routes.MapHttpRoute(
        "AccountVerification", 
        "api/{controller}/{accountID}/{action}" 
        ); 
    
    
    config.Routes.MapHttpRoute(
        "Default", 
        "api/{controller}/{accountID}", 
        defaults: new { Controller="Account", action = "GetByKey", accountID = RouteParameter.Optional } 
        ); 
    
+0

今晚我會試一試。問題 - 不是假指導仍然是指導;我的意思是爲什麼它會反序列化爲null,而且,我的要求是必須提供VerifyAccount方法的accountID參數...它不是可選的,並且{action}必須是「verify」才能解析爲VerifyAccount方法...到目前爲止在應用程序中沒有其他操作 – gplusplus 2013-03-11 12:55:50

+0

非常感謝您的幫助。 – gplusplus 2013-03-12 00:37:44

1

GET/api/account/00000000-0000-0000-000000000001/verify與路由集合中的第一條路由相匹配。因此,它從不檢查第二條路線,看它是否匹配。使「api/{controller}/{id}/{action}」成爲您收藏中的第一條路線,它應該可以正常工作。

+0

好吧,我沒有,但它仍然是相同的消息: 「沒有HTTP資源發現匹配的請求URI「API /帳號/ f476397e-5e3e-470B-8621-573d63698cd7 /驗證」 – gplusplus 2013-03-11 04:19:01

+0

看起來你在api和控制器動作之間有'v1'。您需要將其刪除或將其添加到路由定義 - 「api/v1/{controller}/{id}/{action}」。 – cmotley 2013-03-11 04:21:06

+0

對不起,這是一個錯字 – gplusplus 2013-03-11 04:22:21

相關問題