C# – ASP.NET MVC routing not working

asp.netasp.net-mvcasp.net-mvc-4c

My routing is not working properly. I have the following routes defined:

routes.MapRoute(
     name: "CategoryDetails",
     url: "{seoName}",
     defaults: new { controller = "Category", action = "Details" }
);

routes.MapRoute(
     name: "ContactUs",
     url: "contact",
     defaults: new { controller = "Home", action = "Contact" }
);

routes.MapRoute(
     name: "AboutUs",
     url: "about",
     defaults: new { controller = "Home", action = "About" }
);

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

When I click on the about us or contact us links then it takes me to the details action method in the category controller.

This is the markup for my about us and contact us links:

@Html.ActionLink("About", "About", "Home")
@Html.ActionLink("Contact", "Contact", "Home")

My details action method for the category controller:

public ActionResult Details(string seoName)
{
     CategoryViewModel model = categoryTask.Details(seoName);

     return View(model);
}

What is wrong with my route configuration?

Best Answer

Reorder your routes from most specific to less specific. That way the routes for contact and about will come before the seoName route:

routes.MapRoute(
        name: "ContactUs",
        url: "contact",
        defaults: new { controller = "Home", action = "Contact" }
);

routes.MapRoute(
        name: "AboutUs",
        url: "about",
        defaults: new { controller = "Home", action = "About" }
);

routes.MapRoute(
        name: "CategoryDetails",
        url: "{seoName}",
        defaults: new { controller = "Category", action = "Details" }
);

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

With your original order, the urls~/contact and ~/about would always be handled by the seoName route. By reordering them, you make sure they are handled by the proper actions in the HomeController and the seoName route will only match a url after the contact and about routes have failed to match.

Related Topic