2010-08-04 7 views
8

UPDATE 2UrlHelper.Action nie mapuje do obszaru że regulator jest prawidłowo

Ok - Tak wygląda moje pytanie ponownie nieznacznie się zmienia :-)

Uświadomiłem sobie teraz, gdy UrlHelper.Action wydaje się nie poprawiać poprawnie adresu URL w żadnym obszarze, chyba że nazwa obszaru jest jawnie określona. Jeśli nie jest określony, wydaje się, że zwraca nazwę obszaru, w którym aktualnie się znajdujemy, co sprawia, że ​​wygląda on tak, jakby działał z jednej części witryny, ale wtedy ten sam link w innym obszarze rozwiązuje problem z nieprawidłową nazwą obszaru.

Albo zrobiłem coś fajnego, żeby to zrobić, albo nie do końca rozumiem, jak ta metoda działania ma działać.

UPDATE 1

mogę dokonać tej pracy, wykonując następujące czynności:

return helper.Action("add", "product",new {area = "storemanagement"}); 

która zmienia moje pytanie nieznacznie.

Jak to się dzieje, że routing MVC nie rozróżnia kontrolerów o tej samej nazwie i nie rozwiązuje tego z określoną metodą działania?

Origional zakładać

Hej wszyscy,

Utworzyłem metody pomocnika w klasie UrlHelper i mam mały problem z jedną z tras.

Oto kod dla metody pomocnika w pytaniu:

public static string AddProduct(this UrlHelper helper) 
     { 
      return helper.Action("add", "product"); 
     } 

Mam zasadniczo dwa kontrolery o nazwie „produkt”, które znajdują się w różnych miejscach na stronie. Jeden z nich służy do przeglądania produktów, a drugi do zarządzania produktami. Tylko jeden z kontrolerów produktu zawiera metodę działania "Dodaj".

Kiedy wyjście I wartość addProduct

<%: Url.AddProduct() %> 

Nazwa obszar został rozwiązany w bieżącym obszarze Mam przeglądanie i nie właściwym miejscu dla kontrolera produktu zawierającego metodę dodawania działania.

Czy jest coś, co muszę ustawić na trasach? Nie jestem do końca pewien, w jaki sposób routing działa z UrlHelper.Action, więc nie wiem, czy można zrobić to, co próbuję.

Wiwaty za pomoc.

+1

spróbuj dodać kontroler i obszar nazwa jako dodatkowe argumenty używające tej metody sig 'UrlHelper.Action Method (String, String, Object)' – Ahmad

+0

Dzięki Ahmad. To faktycznie działa, więc dodam go jako aktualizację mojego pytania. Nadal interesuje mnie, dlaczego system routingu nie rozróżnia dwóch kontrolerów, a zamiast tego wydaje się, że rezygnuje i zakłada korzystanie z bieżącego obszaru. –

+0

, aby odpowiedzieć na twoje pytanie, należy zagłębić się w wewnętrznych ramach MVC, aby dowiedzieć się, dlaczego tak się dzieje. W każdym razie, z tego, co widziałem tylko wartości tras "kontrolera" i "działania", są traktowane w specjalny sposób, tj. Obszar jest w pewnym sensie wywnioskowany/przyjęty w oparciu o to, skąd dzwonisz do pomocnika. Zatem potrzeba określenia parametru obszaru. – Ahmad

Odpowiedz

1

To jest domyślne zachowanie routingu ASP.NET.

W polu "Obszar" działanie (i widok) są wyszukiwane według kontrolera i nazwy akcji w domyślnych lokalizacjach. Widok jest uważany za ActionName, chyba że podano inaczej w działaniu, np.return PartialView("_MyPartialView.cshtml", ViewModel)

domyślne lokalizacje są następujące: {Kontroler} = nazwa kontrolera, {Area} = nazwa obszaru

kontrolera:

"Areas/{Area}/{Controller}/" 
"Controllers/{Controller}" 

Odwiedzin:

"Areas/{Area}/Views/{Controller}/" 
"Areas/{Area}/Views/Shared/" 
"Views/Shared" 

Jeśli don” • podać obszar w wartościach trasy, nigdy nie będzie wyszukiwał poza tymi lokalizacjami. Obszar jest taki sam jak miejsce, w którym dzwonisz do swojego pomocnika. Jeśli jesteś na poziomie głównym (nie w polu) będzie ograniczona do

"Controllers/{Controller}" // controller 
"Views/{Controller}/" // views 
"Views/Shared" // views 

Problem polegał na tym, że kiedy, gdzie w jednym AREA1 on szukał "Areas/Area1/{Controller}/" i kiedy byłaś w obszarze2 to przeszukiwane "Areas/Area2/{Controller}/" (I obaj przeszukali Controllers/Product i Controllers/Shared). Był w stanie go znaleźć, gdy znajdujesz się w odpowiednim obszarze, ponieważ pasował on do domyślnej lokalizacji wyszukiwania, ale nie podczas pobytu w innym obszarze, ponieważ kontroler znajdował się tylko w jednym fizycznym obszarze.

Dodanie obszaru w taki sposób, jak to zrobiono, nakazuje wyszukiwanie w predefiniowanym obszarze, aby trafił bezpośrednio do niego. "Areas/Storemanagement/Views/product/" i wyszukaj widok zdefiniowany w akcji Dodaj.

Nie ma sensu, aby pusta metoda pomocnicza zwracała metodę Url.Action, ale być może była to tylko demonstracja.

(Właśnie zauważyłem pytanie jest dość stary, ale myślę, że to może być tutaj w przyszłości)

1

Wystarczy umieścić odpowiedź w sekcji odpowiedzi Dla jasności ...

Musisz aby dodać Area do RouteValues za każdym razem, gdy używasz UrlHelper.Action do generowania ścieżki łącza.

Jeśli w sterowniku, można stub a UrlHelper tak:

var httpContext = new HttpContextWrapper(System.Web.HttpContext.Current); 
var requestContext = new RequestContext(httpContext, new RouteData()); 
var urlHelper = new UrlHelper(requestContext); 

łatwo Cię get the current area tak:

HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"] 

Wreszcie, przy użyciu UrlHelperpass the area in the RouteValues object takiego:

var url = urlHelper.Action("Index", "Home", new { area = "Pages" }));