Właśnie natknąłem się na to pytanie i mimo że jest już dość stare, nadal jest bardzo aktualne. Jak na ironię, jeden poprawny komentarz w tym wątku został opublikowany przez początkującego w MVC, gdy napisał ten post. Nawet dokumenty ASP.NET nie są całkowicie poprawne. Mam duży projekt i skutecznie przeciążam metody działania.
Jeśli rozumiemy routing, poza prostym domyślnym wzorcem trasy {controller} / {action} / {id}, może być oczywiste, że działania kontrolera można odwzorować przy użyciu dowolnego unikalnego wzorca. Ktoś tutaj mówił o polimorfizmie i powiedział: „HTTP nie rozumie polimorfizmu”, ale routing nie ma nic wspólnego z HTTP. Mówiąc najprościej, jest to mechanizm dopasowywania wzorca łańcucha.
Najlepszym sposobem, aby to zadziałało, jest użycie atrybutów routingu, na przykład:
[RoutePrefix("cars/{country:length(3)}")]
public class CarHireController
{
[Route("{location}/{page:int=1}", Name = "CarHireLocation")]
public ActionResult Index(string country, string location, int page)
{
return Index(country, location, null, page);
}
[Route("{location}/{subLocation}/{page:int=1}", Name = "CarHireSubLocation")]
public ActionResult Index(string country, string location, string subLocation, int page)
{
//The main work goes here
}
}
Działania te zajmą się adresami URL takimi jak /cars/usa/new-york
i /cars/usa/texas/dallas
, które będą mapowane odpowiednio na pierwszą i drugą akcję indeksu.
Analizując ten przykładowy kontroler widać, że wykracza on poza domyślny wzorzec trasy wspomniany powyżej. Domyślnie działa dobrze, jeśli struktura adresu URL dokładnie odpowiada konwencjom nazewnictwa kodu, ale nie zawsze tak jest. Kod powinien opisywać domenę, ale adresy URL często muszą iść dalej, ponieważ ich treść powinna opierać się na innych kryteriach, takich jak wymagania SEO.
Zaletą domyślnego wzorca routingu jest to, że automatycznie tworzy on unikalne trasy. Jest to wymuszane przez kompilator, ponieważ adresy URL będą pasować do unikalnych typów kontrolerów i członków. Opracowanie własnych wzorów tras będzie wymagało dokładnego przemyślenia, aby zapewnić wyjątkowość i ich działanie.
Ważna uwaga Jedną wadą jest to, że używanie routingu do generowania adresów URL dla przeciążonych akcji nie działa, gdy jest oparte na nazwie akcji, np. Przy użyciu UrlHelper.Action. Ale działa, jeśli używa się nazwanych tras, np. UrlHelper.RouteUrl. A korzystanie z nazwanych tras jest, zgodnie z dobrze szanowanymi źródłami, sposobem na zrobienie tego ( http://haacked.com/archive/2010/11/21/named-routes-to-the-rescue.aspx/ ).
Powodzenia!