Wciąż jestem nowy w MVC, więc mam nadzieję, że jest to proste.

Potrzebuję kategorii i podkategorii, potencjalnie wielopoziomowych, i staram się odpowiednio zorganizować mój projekt. W tej chwili używam out-of-the-box projektu MVC w VS2008.

Załóżmy na przykład, że chcę przejść do: http://mysite.com/products/elektronika/komputery/laptopy

Mogę to osiągnąć, umieszczając LaptopsController w moim katalogu Controllers, katalog Latops z różnymi plikami aspx w moich widokach i dodając linię do mojej klasy Global.asax, która mapuje tę konkretną trasę do odpowiedniego kontrolera.

Ale mam nadzieję, że istnieje sposób na automatyczne mapowanie trasy, przy jednoczesnym utrzymaniu uporządkowanej i uporządkowanej struktury katalogów w projekcie, ponieważ będzie wiele różnych kategorii i produktów. W idealnym przypadku w moim projekcie powinny znajdować się katalogi fizyczne dla kontrolerów i widoków, odpowiadające „katalogom” w ścieżce adresu URL. Ale nie wydaje mi się, żeby to działało.

Zapoznałem się z kilkoma artykułami na temat dokonywania poważnych zmian w routingu, ale wolałbym tego nie robić, jeśli to możliwe. Wygląda na to, że byłoby to coś wbudowanego, więc może po prostu czegoś mi brakuje.

Gdybyś mógł wskazać mi właściwy kierunek, byłoby wspaniale.

2
Joe Enos 22 czerwiec 2011, 04:20

2 odpowiedzi

Najlepsza odpowiedź

Najprawdopodobniej nie potrzebujesz LaptopsController, tylko ProductsController. W tym przypadku Electronics/Computers/Laptops informuje ProductsController, którą kategorię produktów ma wyświetlić (za pomocą wartości trasy).

5
Ethan Cabiac 22 czerwiec 2011, 04:25
2
+1. Wyjaśnienie dotyczące przykładu trasy: routes.MapRoute("ProductRoute", "Products/{department}/{category}/{product}" new { controller = "Products" });
 – 
RPM1984
22 czerwiec 2011, 04:38
Dzięki Wam obojgu. To ma sens. Ale wygląda na to, że działałoby to idealnie, zakładając, że używam tylko jednego widoku globalnego dla wszystkich produktów (którym jestem w tym przypadku). Ale załóżmy, że potrzebuję różnych widoków dla każdej kategorii lub każdego działu — czy mogę je uporządkować hierarchicznie i nadal wywoływać je z tego jednego kontrolera?
 – 
Joe Enos
22 czerwiec 2011, 05:11
W metodzie kontrolera możesz określić dowolny widok.
 – 
Antoine Latter
22 czerwiec 2011, 10:20
Rozumiem — przekazywanie struktury podkatalogów do metody View() działa dla mnie, więc mój pojedynczy kontroler może wywołać View(string.Format("{0}/{1}/{2}/{3}", department, category, product, action) i wydaje się, że działa dokładnie tak, jak chcę. Dziękuję wszystkim.
 – 
Joe Enos
22 czerwiec 2011, 17:32

JEŚLI masz problemy z routingiem, wypróbuj debugger Haacked routing.

http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

Jeśli chcesz przechwycić wszystkie informacje o produktach i uzyskać zawartość, możesz wykonać następujące czynności:

    routes.MapRoute("Products", "products/{*params}", 
                    new { controller = "Product",  action = "Details", params= "" });


   public ActionResult Details(string params) 
   {     
           // Split the params with '/' as delimiter. 
           string [] productParams = params.Split('/');
           if(productParams.Lengh > 0)
           {
             var category = productParams.Length > 0 ? productParams[0]: null;
             var subCategory = productParams.Length > 1 ? productParams[1]: null;
             var detailModel //get model information and build return..

             ViewData.Model = detailModel; 
             Return View("Details");
           }
           Return View("Error");

          //etc.



   }
0
Nickz 22 czerwiec 2011, 05:05
2
Dzięki, sprawdzę rzecz Haacked - wygląda na to, że będzie pomocna.
 – 
Joe Enos
22 czerwiec 2011, 05:13