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