2013-09-10 43 views
2

我試圖做一個途徑,但它不是在這種情況下工作:屬性路由 - 枚舉不分析

如果我稱之爲:

http://mysite.com/api/v1/product/Generic/1A 

工作正常。

如果我稱之爲:

http://mysite.com/api/v1/product?=Generic 

工作過,但是當我打電話:

http://mysite.com/api/v1/product/Generic 

我得到這個錯誤:

{ 
"Message":"The request is invalid.", 
"MessageDetail":"The parameters dictionary contains a null entry for parameter 'type' 
of non-nullable type 'GType' for method 'System.Net.Http.HttpResponseMessage 
Get(GType)' in 'MySite.ControllersApi.V2.ProductController'. An optional parameter must 
be a reference type, a nullable type, or be declared as an optional parameter." 
} 

我的路由的代碼:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute 
     (
      name: "DefaultApi", 
      routeTemplate: "api/{version}/{controller}/{type}/{id}", 
      defaults: new { id = RouteParameter.Optional, version = "v1", controller = "Product" } 
     ) 
    } 
} 

public enum GType 
{ 
    Big, 
    Small, 
    Generic, 
} 

和控制器:

public HttpResponseMessage Get(GType type) 
{ 
    ... 
} 

public HttpResponseMessage Get(GType type, string id) 
{ 
    ... 
} 

所以,網頁API不解析URL中的價值。我忘記了什麼嗎?

+0

你發佈的內容沒有意義。沒有辦法,你的第一個網址將與給定的路線一起工作。你能清理樣品嗎? –

+0

我修正了這個例子。 –

+0

你的電話仍然沒有任何意義。您的路線中有'api'和'{version}',因此您的通話應以http://mysite.com/api/v1/ ... –

回答

2

問題是我有兩個等於路線,但與diferents參數名稱。

api/{version}/{controller}/{type}/{id} 

api/{version}/{controller}/{id} 

第二個必須聲明的最後一個路徑。

0

您向我們展示的路線不會與您嘗試點擊的網址相匹配。我有一種感覺,你正在看錯誤的路線。此外,並非"/Product/"應該是「/{controller}/"

哦,你拼錯routeTamplate(原文如此)的片段我認爲這是一個抄寫錯誤? - 我敢肯定,編譯器會樹皮上。

+0

是的,這是一個抄寫錯誤。 –

2

好了,我仍然無法看到你的第一個URL實際上是如何工作的,但第二個網址的問題是,你正在試圖通過無效的數據位作爲參數。

爲了保持它的簡單,我只是假裝你的路線定義是這樣的:

routeTemplate: "api/{controller}/{type}/{id}", 
defaults: new { id = RouteParameter.Optional } 

如果你打電話給這個URL http://mysite.com/product/Generic GET,那麼你會得到你遇到的同樣的錯誤。該URL將解析控制器ProductController,其參數爲類型,其值將爲通用

但是,您的type參數的實際類型爲GType,這是一個枚舉。通用不是有效的值,所以發生錯誤。這與發送「abcd」作爲int參數的值相同。

如果您試圖調用get到http://mysite.com/product/Big,它將起作用,因爲它可以解析該值(Big)和GType enum的成員。

+0

我忘了通用。 –

+0

我做了一些改變,我想我很快就做出了這個例子,但現在它是正確的。 –