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
Schreibe einen Kommentar