Chcę wybrać Akcja mojego kontrolera na podstawie żądanego typu nośnika w nagłówku Accept.Czy jest możliwe wybranie akcji z atrybutem AttributeRouting w .NET MVC na podstawie typu nośnika nagłówka Accept?
Na przykład mam zasób o nazwie podmiot. Jej trasa jest przypisana:
GET/przedmiotów/{subjectId: int}
Normalnie przeglądarka żąda text/html
, co jest w porządku. Domyślnie Media Formatter radzi sobie z tym świetnie.
Mam teraz niestandardową logikę, którą chcę wykonać, gdy ta sama trasa jest dostępna z nagłówkiem akceptującym, określającym application/pdf
jako akceptowany typ nośnika.
Mogłem utworzyć niestandardowy formater mediów, ale, jak rozumiem, oznaczałoby to, że każda trasa, która jest żądana z nagłówkiem Accept pod numerem application/pdf
, również byłaby uruchamiana przez ten format formatowania mediów. To jest niedopuszczalne.
W Javie istnieje adnotacja o nazwie @Produces
:
@Produces adnotacja jest używana do określenia typów MIME lub medialne reprezentacje zasobu mogą produkować i wysyłać z powrotem do klienta. Jeśli zostanie zastosowana klasa @Produces, wszystkie metody w zasobie mogą domyślnie generować określone typy MIME. W przypadku zastosowania na poziomie metody adnotacja zastępuje wszelkie adnotacje @Produces zastosowane na poziomie klasy.
Pozwoliłoby mi wykonać następujące czynności:
namespace MyNamespace
{
[RoutePrefix("subjects")]
public class SubjectsController : Controller
{
[Route("{subjectId:int}")]
[HttpGet]
public ActionResult GetSubject(int subjectId)
{
}
[Route("{subjectId:int}")]
[HttpGet]
[Produces("application/pdf")]
public ActionResult GetSubjectAsPdf(int subjectId)
{
//Run my custom logic here to generate a PDF.
}
}
}
Nie ma Produkuje atrybut .NET, że mogę znaleźć, oczywiście, tak to nie działa. Nie byłem też w stanie znaleźć podobnego atrybutu.
Mogę oczywiście ręcznie sprawdzić nagłówek w treści akcji i przekierować go do innej akcji, ale w najlepszym przypadku wydaje się to być hackowe.
Czy istnieje mechanizm .NET 4.5, który mogę użyć, aby wyciągnąć to, że przegadam lub brakuje?
(używam MVC 5.2.2 z Nuget repozytorium)
Wydaje się być możliwe za pomocą niestandardowego selektora kontrolera: http: // stackoverflow.com/questions/25941590/asp-net-mvc-przechwytywanie-routing-i-przekierowywanie-do-różnych-działań-tras – mostruash
@mostruash Nie wygląda na to, że wybieram kontroler, ale chcę, żeby zacząłem szukać do selektorów akcji, które są podobne. Zajrzę i zobaczę, czy uda mi się to rozgryźć. – crush
Teraz myślę, że mogę potencjalnie użyć ograniczenia trasy, ale nie jestem jeszcze pewien. – crush