Frage MVC 5 Web Api - Erben Route vom Basis-Controller


Ist es "legal", dass ein Controller eine Route von seinem Controller erbt? BaseController ? Es scheint so zu sein nicht für Attribute Routing erlaubt , aber wie wäre es mit einer normalen Routenregistrierung über RouteCollection?

Der Grund ist, dass ich momentan eine Reihe von Controllern habe, von denen jeder eine Art Dateikonverter darstellt. Jeder von ihnen verfügt über einen gemeinsamen Satz von Methoden zum Hochladen der zu konvertierenden Datei. Diese Methode sind Endpunkte auf jedem Controller, nicht nur auf privaten Methoden. Ich möchte, dass folgende Routen gültig sind:

/api/controller1/uploadfile
/api/controller2/uploadfile
/api/controller3/uploadfile

Kann ich ein Beispiel dafür bekommen, wie dies in einem BaseController durchgeführt werden könnte und ob dies nicht möglich ist, eine Alternative.


5
2017-12-03 14:17


Ursprung


Antworten:


Folgendes funktioniert:

public abstract class BaseUploaderController : ApiController
{
    [HttpGet, Route("uploadfile")] //Needs both because HttpGet("uploadfile") currently only supported in MVC attribute routing 
    public string UploadFile() 
    {
        return "UploadFile";
    }
}


[RoutePrefix("api/values")]
public class ValuesController : BaseUploaderController
{
    [Route("{id:int}")]
    public string Get(int id)
    {
        return "value";
    }
}

2
2017-12-04 17:08



Suchst du das hier? UploadFile Aktion im Basis-Controller und andere Controller, die von ihnen erben, sollten dennoch in der Lage sein zu treffen UploadFile von ihren jeweiligen Routen wie Sie in Ihrem Beitrag erwähnt? Wenn ja, könnten Sie einen abstrakten Basis-API-Controller erstellen und diesen platzieren UploadFile Aktion darin und Ihre Anfragen an die einzelnen Controller sollten funktionieren wie erwartet.

Beispiel:

public abstract class BaseApiController : ApiController
{
    // POST /api/Values
    // POST /api/Test
    public string UploadFile()
    {
        return "UploadFile";
    }
}

public class TestController : BaseApiController
{
    // GET /api/test/10
    public string GetSingle(int id)
    {
        return "Test.GetSingle";
    }
}

public class ValuesController : BaseApiController
{
    // GET /api/values/10
    public string GetSingle(int id)
    {
        return "Values.GetSingle";
    }
}

1
2017-12-03 17:06



Gemäß dieser Antwort https://Stackoverflow.com/a/21610390/122507 Attributrouten werden nicht vererbt.

Ich diskutiere derzeit zwischen der Einführung unnötiger Methode in 30 Controller, nur so kann ich eine Attribut-Route hinzufügen oder fügen Sie einen falschen Parameter der Basisklasse-Methode, um die Standard-Routing zwischen Get (int id) und GetHistory (int id, bool history) zu disambiguate wo ich den zweiten Parameter nicht brauche.


1
2018-06-20 14:51