2017-03-20 21 views
0

下面的代碼Dotnet核心無法區分名稱相同但參數不同的動作?

public class OrderController : Controller 
{ 
    // GET api/values 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

    // GET api/values/5 
    public string Get(int id) 
    { 
     return "value"; 
    } 
} 

它可以在ASP.NET 4.5運行良好,但它不會對DOTNET核心1.1 .The錯誤訊息話題工作:

失敗:Microsoft.AspNetCore.Mvc .Internal.ActionSelector [1] 請求匹配多個操作導致歧義。匹配操作:WebAPI.Controllers.OrderController.Get(的WebAPI) WebAPI.Controllers.OrderController.Get(的WebAPI)

失敗:Microsoft.AspNetCore.Server.Kestrel [13] 連接ID 「0HL3F88N44HR6」:未處理的異常被應用程序拋出。 Microsoft.AspNetCore.Mvc.Internal.AmbiguousActionException:匹配多個操作。以下動作匹配的路由數據,並已全部約束滿足: WebAPI.Controllers.OrderController.Get(的WebAPI) WebAPI.Controllers.OrderController.Get(的WebAPI)

回答

0

嘗試這樣的:

// GET api/values/5 
[HttpGet("Get/{id}"] 
public string Get(int id) 
{ 
    return "value"; 
} 
0

您可以通過像這樣添加HttpGet屬性來解決此問題。

[HttpGet("{id}")] 
// GET api/values/5 
public string Get(int id) 
{ 
    return "value"; 
} 

這是因爲在ASP.NET 5,對於Web API路由,使用Routes.MapHttpRoute方法和ASP.NET MVC Routes.MapRoute方法。在ASP.NET Core中,使用Routes.MapRoute方法。

1

這不是Asp.Net.Core的問題,確切的說,在MVC4和MVC5中都有相同的行爲。

ASP.NET MVC不支持方法重載,有很多關於這個做題和文章:

可能有一組解決方案來獲得所需的行爲,其中之一是:

首先 - 使用內置屬性,派生自MVC4中的ActionFilterAttributeActionMethodSelectorAttribute(它是在處理請求時檢索所需操作的基類)。例如ActionNameAttributeHttpGetAttributeHttpPostAttribute等:

public IEnumerable<string> Get() 
{ 
    return new string[] { "value1", "value2" }; 
} 

[ActionName("GetById") 
public string Get(int id) 
{ 
    return "value"; 
} 

或者只需重命名你的方法。

另一種解決方案是創建自己的屬性,如ActionFilterAttribute所示,如第二個鏈接所示。

當我面對這個問題,我解決了這個通過傳遞一個可空參數以下列方式:

public object Get(int? id) 
{ 
    if (id == null) 
     return new string[] { "value1", "value2" }; 

    var passedId = (int) id; 
    return GetValueByPassedId(passedId); 
} 
+0

謝謝。但爲什麼它可以在ASP.NET 4.5 –

+0

工作得很好,也不會在ASP.NET 4.5做工精細,檢查相關鏈接,這裏所描述的同樣的問題在不同版本的ASP.NET –

+0

的它的演示代碼,在Visual Studio生成。 ORZ –

相關問題