2009-10-20 16 views
5

Jak mogę uzyskać nazwę kontrolera względnego adresu URL, korzystając z tras, które zdefiniowałem w Global.asax?ASP.NET-MVC. Jak uzyskać nazwę kontrolera z adresu URL?

Przykład:

jeśli mam defiend trasy tak:

routes.MapRoute(
       "Default",            // Route name 
       "{language}/{controller}/{action}/{id}",     // URL with parameters 
       new { controller = "Home", action = "Index", id = "", language = "en" } 

od napisu "~/pl/products/lista" Chcę mieć produkty (nazwa sterownika). Czy istnieje jakaś istniejąca metoda, która już to robi?

+1

Gdzie to się znajduje? –

+0

W klasie pomocniczej, która rozszerzy UrlHelper – Gregoire

+0

https://stackoverflow.com/questions/8830052/how-do-i-get-the-controller-and-action-names-from-the-referrer-uri –

Odpowiedz

4

Zobacz Stephen Walther w blogu ASP.NET MVC Tip #13 – Unit Test Your Custom Routes

Projekt MvcFakes ma starą referencję System.Web.Abstractions. Musisz więc wymienić go na nowy i ponownie skompilować projekt, aby pobrać MvcFakes.dll.

To jest mój kod:

public string getControllerNameFromUrl() 
{ 
    RouteCollection rc = new RouteCollection(); 
    MvcApplication.RegisterRoutes(rc); 
    System.Web.Routing.RouteData rd = new RouteData(); 
    var context = new FakeHttpContext("\\" + HttpContext.Request.Url.AbsolutePath); 
    rd = rc.GetRouteData(context); 
    return rd.Values["action"].ToString(); 
} 

W moim kodu powyżej "MvcApplication" jest nazwą klasy w Global.asax.

Powodzenia!

+0

Dzięki, spróbuję. – Gregoire

+0

Link do blogu Stephena Walthera powyżej nadal działa. Jednak raz na swojej stronie, link do pobrania nie powiedzie się i link do Tip # 12 również się nie powiedzie - więc nie mogę uzyskać listy z klasy "FakeHttpContext". Czy znasz inne miejsca, aby uzyskać podobną funkcjonalność? – Zarepheth

+0

Tip # 12 jest tutaj: http://stephenwalther.com/archive/2008/07/01/asp-net-mvc-tip-12-faking-the-controller-context – VeeTheSecond

1

Nie jestem pewien, o co pytasz, więc jeśli moja odpowiedź jest błędna, to dlatego, że zgaduję, co chcesz.

Zawsze możesz dodać kolejną trasę do swojej Global.asax. To często najłatwiejszy sposób radzenia sobie z przypadkami "poza normą".

Jeśli chcesz powrócić listę produktów, będziesz korzystać z tej trasy:

routes.MapRoute(
      "ProductList",   
      "{language}/{products}/{action}/", 
      new { controller = "Products", action = "List", language = "en" }); 

Można również wymienić produkty o bardziej ogólne {controller} jeśli więcej niż jeden typ jednostki zamierza to wykorzystać trasa. Powinieneś zmodyfikować go do swoich potrzeb.

Na przykład, aby zrobić to generic trasy, które można użyć, aby uzyskać listę jakiegokolwiek produktu:

routes.MapRoute(
      "ProductList",   
      "{language}/{controller}/{action}/", 
      new { controller = "Products", action = "List", language = "en" }); 

Co to robi jest to, że tworzy trasy (które zawsze należy umieścić przed swoją Default route), która mówi: "Za cokolwiek użytkownik wejdzie, daj mi kontroler i akcję, o którą prosi". (Takich jak /en/Products/List lub /en/Users/List).

Aby odwiedzić ten kontroler, wystarczy przejść do następującego: yoursite.com/en/products/list. Możesz również użyć HTMLActionLink, aby odwiedzić kontroler.

<%=Html.ActionLink("Product", "List", new { controller = Products }, null) %>

Piszę to bez mojego IDE otwartym, więc ActionLink może mieć błąd w nim.

+1

Dzięki za poświęcając czas na udzielenie mi odpowiedzi, ale to, czego szukam, to "odwrotna" funkcja GetRoute, tj. z adresu URL (nie obecnego), chcę być w stanie wydobyć nazwę kontrolera – Gregoire

+0

@Gregoire Świetnie, uh, dlaczego nie powiedziałeś tego w pierwszej kolejności? –

+0

Przepraszam, ale popełniłem błąd, ponieważ uważałem, że było wystarczająco jasne. – Gregoire

6

Powinieneś chyba dodawać inna trasa jak George sugeruje, ale jeśli naprawdę wystarczy wartość kontrolera pochodzący z trasy można to zrobić w swoich metodach działania kontrolera:

var controller = (string)RouteData.Values["controller"]; 
+1

W jaki sposób mogę uzyskać nazwę kontrahenta z dowolnego adresu URL, a nie z RouteData? – Gregoire

+0

@Gregoire? Masz na myśli arbitralny URL w Twojej witrynie lub czyjejś? Jeśli na twojej stronie, to powiedział ci, jak. –

+1

Nie, ponieważ działa tylko dla bieżącego adresu URL, jeśli nie pomylę się (działa z bieżącym kontekstem HTTP) – Gregoire

Powiązane problemy