2017-03-20 3 views
0

Der folgende CodeDotnet-Kern kann nicht Aktionen mit dem gleichen Namen, aber unterschiedlichen Parametern unterscheiden?

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

Es kann auf 4,5 ASP.NET gut funktionieren, aber es funktioniert nicht auf Dotnet Kern 1.1 .Die Fehlermesssage:

fehlschlagen: Microsoft.AspNetCore.Mvc .Internal.ActionSelector [1] Anforderung mehrerer aufeinander abgestimmter Aktionen, die zu Mehrdeutigkeiten führen. Passende Aktionen: WebAPI.Controllers.OrderController.Get (WebAPI) WebAPI.Controllers.OrderController.Get (WebAPI)

fehlschlagen: Microsoft.AspNetCore.Server.Kestrel [13] Verbindungs-ID "0HL3F88N44HR6": Eine nicht behandelte Ausnahme wurde von der Anwendung geworfen. Microsoft.AspNetCore.Mvc.Internal.AmigiousActionException: Mehrere Aktionen übereinstimmten. Die folgenden Aktionen Routendaten angepasst und waren alle Bedingungen erfüllt: WebAPI.Controllers.OrderController.Get (WebAPI) WebAPI.Controllers.OrderController.Get (WebAPI)

Antwort

0

wie diese versuchen:

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

Sie können dies beheben, indem Sie das HttpGet-Attribut wie folgt hinzufügen.

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

Es ist, weil in ASP.NET 5, für Web-API-Routing, wurde Routes.MapHttpRoute Verfahren verwendet und für ASP.NET MVC routes.MapRoute Methode. In ASP.NET Core wird die Methode Routes.MapRoute verwendet.

1

Es ist kein Problem von Asp.Net.Core, genau das gleiche Verhalten ist in MVC4 und MVC5.

ASP.NET MVC nicht Methode Überlastung unterstützen, gibt es eine Menge von SO Fragen und Artikel dazu:

Es könnte eine Reihe von Lösungen geben, um das gewünschte Verhalten zu erhalten Einer der Commons sind:

Zuerst - verwenden Sie das integrierte Attribut, abgeleitet von ActionFilterAttribute oder ActionMethodSelectorAttribute in MVC4 (es ist die Basisklasse für das Abrufen der erforderlichen Aktion während der Bearbeitung Ihrer Anfrage). Zum Beispiel ActionNameAttribute, HttpGetAttribute, HttpPostAttribute, etc:

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

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

Oder einfach Ihre Methode umbenennen.

Eine andere Lösung besteht darin, ein eigenes Attribut zu erstellen, das von ActionFilterAttribute abgeleitet ist, wie auf der zweiten Verknüpfung vorgeschlagen.

Wenn ich dieses Problem konfrontiert, ich löste dies durch einen Nullable-Parameter in der folgenden Art und Weise übergeben:

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

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

Danke. Aber warum kann es gut auf ASP.NET 4.5 –

+0

Es kann nicht gut in ASP.NET 4.5 funktionieren, überprüfen Sie verwandte Links, hier beschrieben das gleiche Problem in verschiedenen Versionen von ASP.NET –

+0

Es ist der Demo-Code, den das Visual Studio generieren. Orz –

Verwandte Themen