1

I'm trying to learn ASP.NET MVC and have a few questions about routing.

Print is a controller, with a Show action, that takes a parameter and returns it back as string.

Consider the code

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

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

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


    }

Why do I get a 404 error when I try host:xxxxx/Print/xxx...? Shouldn't it take me to the Show action?

Also if I set url:Print, and try host:xxxxx/Print I get the same error. It should take me to the Show action.

Similarly if I set url:Print/{action}/{id} and try host:xxxxx/Print/Show it gives the same error, even though the parameter is optional, and should return blank?

But if I interchange the two routes such that the Print route is first in precedence and Home/Index in second, I do not get any errors in any cases? host:xxxxx/Print shows blank, host:xxxxx/Print/Show shows blank and host:xxxxx/Print/Show/xxx... returns some value.

Why do I get errors if I set it as the second route?

1 Answer 1

1

Change the routes register order to:

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

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

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

The routes in the RegisterRoutes() are analyzed in order they are added to the routes. The Default route pattern is universal, therefore the second doesn't work. The MVC trying to find the Show action in the Home controller and does not finding it. Therefore it report the 404 error.

If look at the RouteCollection declaration it is inherited from IList<T>. So, the routes analyzed in order they added to the routes table.

Any your routes should be added before the Default route.

Sign up to request clarification or add additional context in comments.

1 Comment

@Farhan Ullah: For more information see the documentation: ASP.NET MVC Routing Overview (C#)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.