Search code examples
c#asp.net-mvcasp.net-routing

ASP.NET MVC 5 Traditional Routing


When I debug it, the Product and Subcategory link works fine, however the Category shows me the list but when I click on one of them to show me the products inside each one, does not display anything.

Here is my ProductsController.cs.

public ActionResult Index(string category, string subcategory, string search, string sortBy, int? page){... }

On the RouteConfig.cs I have:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "ProductsCreate",
        url: "Products/Create",
        defaults: new { controller = "Products", action = "Create" }
    );

    routes.MapRoute(
        name: "ProductsbySubCategorybyPage",
        url: "Products/{subcategory}/Page{page}",
        defaults: new { controller = "Products", action = "Index" }
    );

    routes.MapRoute(
        name: "ProductsbyCategorybyPage",
        url: "Products/{category}/Page{page}",
        defaults: new { controller = "Products", action = "Index" }
    );

    routes.MapRoute(
        name: "ProductsbyPage",
        url: "Products/Page{page}",
        defaults: new { controller = "Products", action = "Index" }
    );

    routes.MapRoute(
        name: "ProductsbySubCategory",
        url: "Products/{subcategory}",
        defaults: new { controller = "Products", action = "Index" }
    );

    routes.MapRoute(
        name: "ProductsbyCategory",
        url: "Products/{category}",
        defaults: new { controller = "Products", action = "Index" }
    );                       

    routes.MapRoute(
        name: "ProductsIndex",
        url: "Products",
        defaults: new { controller = "Products", action = "Index" }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

Solution

  • Your ProductsbyCategorybyPage is overwritten by ProductsbySubCategorybyPage. When ASP.NET is trying to parse the incoming URL, it will stop with the find match, and URL like Products/A/Page3 will be passed through the ProductsbySubCategorybyPage route. Routing module does not know what do you prefer A to be, subcategory or category. You need to refactor your RegisterRoutes method to use unique route masks. Like Products/SubCategory/{subcategory} and Products/Category/{category} for example.