Attribut-routing und Vererbung
Ich bin Herumspielen mit der Idee, einen Basis-controller nutzt ein generisches repository, um die grundlegenden CRUD-Methoden für meine API-Controller, so dass ich nicht haben, duplizieren Sie die gleichen basic-code in jeder neuen controller. Bin aber in Probleme mit dem routing-Attribut erkannt, wenn es in der Basis-controller. Um zu zeigen, was genau das problem das ich habe ich habe eine wirklich einfache WebAPI controller.
Wenn ich einen Get
Methode in der main-Controller und es erbt von der ApiController
direkt habe ich keine Probleme, und diese wie erwartet funktioniert.
[RoutePrefix("admin/test")]
public class TestController : ApiController
{
[Route("{id:int:min(1)}")]
public string Get(int id)
{
return "Success";
}
}
Wenn ich mich bewege, die Get
Methode in einer Basis-controller ist wieder der Inhalt der 404-Seite.
[RoutePrefix("admin/test")]
public class TestController : TestBaseController
{
}
public class TestBaseController : ApiController
{
[Route("{id:int:min(1)}")]
public string Get(int id)
{
return "Success";
}
}
Einige weitere interessante Hinweise:
-
Kann ich access die Aktion bei
GET
/Test/1
. So ist es, es zu finden, basierend auf der Standard-route immer noch. -
Wenn ich versuche, auf
POST
/admin/test
es gibt die folgende JSON -{
"Message":"Keine HTTP-Ressource gefunden wurde, entspricht der request-URI 'http://test.com/admin/test'.",
"MessageDetail":"Keine Art gefunden wurde, entspricht dem Domänencontroller mit dem Namen 'admin'."
}
Kennt jemand einen Weg, um die routing-arbeiten mit Attributen, die aus einem Basis-controller?
- Ich bin versucht zu erreichen, die genau die gleiche Sache - verwenden Sie einen base-api-controller zu handhaben CRUD - ich bin überrascht, es ist nicht mehr üblich. Dies ist das erste mal, ich habe gesehen Erwähnung von jemand anderes versuchen diese, und jetzt bin ich stecken in der routing-Erbe-problem. Könnten Sie teilen, was Sie am Ende machen?
- Ich habe den Basis-controller haben protected Methoden auf, die Implementierung der CRUD-Operationen und dann, wenn ich einen neuen controller habe ich zum erstellen der öffentlichkeit-Methode und haben es rufen Sie die protected-Methode. Auf diese Weise kann ich die Routen auf die Methode im controller und nicht in der Basis-controller, und nicht den code duplizieren überall. Ich glaube nicht, Liebe es, aber die alternative war, nicht zu verwenden, Route Attribute und das war nicht zur Arbeit zu gehen, in meiner situation, aus verschiedenen Gründen.
- Danke für die Antwort. Ich ging mit ähnlich, nur aufrufen base.[Get|Post|Put|Delete]() und der übergabe über den Parameter. Es ist nicht ideal, aber ich nehme an, der Vorteil ist, dass es noch deutlicher für Menschen, die nicht mit dem code, wo man benutzerdefinierte CRUD-Aktionen. Haben Sie gefunden, andere online-Ressourcen, die diskutieren mit einem Basis-controller zu handhaben CRUD-Operationen? Meine Suche lieferte mir keine Ergebnisse.
- Bitte Stimmen Sie für das Problem, das ich geöffnet, wenn Sie hinzufügen möchten Vererbung AttributeRouting - aspnetwebstack.codeplex.com/workitem/1688
Du musst angemeldet sein, um einen Kommentar abzugeben.
Attribut Routen können nicht vererbt werden. Dies war eine bewusste design-Entscheidung. Wir nicht fühlen und nicht sehen, gültigen Szenarien, wo es Sinn machen würde, zu Erben Sie.
Könnte Sie geben ein realistischeres Szenario, wo würden Sie wollen, dies zu nutzen?
[Update(3/24/2014)]
In der kommenden 5.2 release des MVC-Web-API, es geht um einen erweiterungspunkt genannt
System.Web.Http.Routing.IDirectRouteProvider
durch die Sie können aktivieren Sie die Vererbung Szenario, das Sie hier suchen. Sie könnten versuchen, diese selbst mit der neuesten Nacht baut(Dokumentation nach, wie man die Nacht baut ist hier)[Update(7/31/2014)]
Beispiel, wie dies getan werden kann, in Web-API
2.2
release:RoutePrefix("api/v1")
und übernehmen dann das Präfix für alle Controller, die ich Baue. Auf diese Weise kann ich das ändern ohne Angst zu vermasseln, und auch habe ich nicht manuell eingestellt, es für jeden neuen controller ich machen (kann zu Fehlern führen). Dies ist aber für die Dinge tun, die andere Weise herum (set[Route("")]
auf der übergeordneten Steuerung und stellen[RoutePrefix("")]
auf das Kind), die hat absolut null Sinn für mich!Mit Web API 2.2, Sie können:
als die hier beschrieben werden: http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22
Bekam es.
Einzige Einschränkung ist hier, dass die route action-Parameter muss der gleiche sein wie der name der Aktion. Ich konnte nicht einen Weg finden, um zu bekommen, dass. (Sie kann nicht benennen Sie die route mit einem RouteAttribute)