Bhavesh Jadav
Bhavesh Jadav

Reputation: 705

How to map same routes for two controller?

I have two controller in my MVC application. One is Home controller and other is User controller. I am using following RouteConfig settings.

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

I want abc.com/Blog abc.com/Login Instead of abc.com/Home/Blog abc.com/User/Login. Above configuration works fine with abc.com/Blog but it is not working with abc.com/Login. How to remove controller name from the link for both controllers? Also how can I only show abc.com when website launches instead of abc.com/index? I am using following code in my webpage to access the particular page.

@Html.ActionLink("Home", "Blog", "Home")
@Html.ActionLink("Login", "Login", "User")

Upvotes: 0

Views: 1209

Answers (3)

NightOwl888
NightOwl888

Reputation: 56909

This is very simple. You just need to create a route for each of your expected URLs.

Keep in mind that if you don't pass the controller or action as a URL placeholder, you will need to do so manually by providing them as default values.

routes.MapRoute(
        "Blog",
        "Blog/{id}",
        new { controller = "Home", action = "Blog", id = UrlParameter.Optional }
    );
routes.MapRoute(
        "Login",
        "Login/{id}",
        new { controller = "User", action = "Login", id = UrlParameter.Optional }
    );
routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

Upvotes: 1

Tommy
Tommy

Reputation: 39817

Without bringing in additional packages, you simply need to add an additional route. To create the new route, you first must define what you want your URL to be. In this case, you have said you want to be able to go to /Login which is on the user controller. Ok - let's create a new route. This route should be located ABOVE your default route.

routes.MapRoute(
            "UserLogin",
            "Login/{id}",
            new { controller = "User", action="Login", id = UrlParameter.Optional }
    );

The first parameter is simply the route name. The second parameter is the format of the URL that I want this route to match. Given we know what action we want to match to this route, we don't need the {action} or {controller} catchall placeholders that are in the default route. Also note that we can declare what controller this route will hit without having to specify the controller in the URL.

Last note, you don't have to have the {id} be part of the route if you will never be passing an ID parameter to that function. If that is the case, then you can safely remove any references to id in the UserLogin route.

As I re-read your question, you should be able to do this for some of your other examples as well. Let's take the /About URL and demonstrate the removal of the {id} parameter.

routes.MapRoute(
            "AboutUsPage",
            "About",
            new { controller = "Home", action="About"}
    );

Upvotes: 1

Charleh
Charleh

Reputation: 14002

Your default route should automatically cater for wanting to nav to abc.com without requiring the index part of the URL

You need to ensure that your main route is specified as the default:

context.MapRoute(
            "Site_Default",
            "{controller}/{action}/{*id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

If you want to map short routes you can do exactly what you've done above. I use this helper function in my own project to map short routes:

void ShortRoute(string action, string controller)
{
    ShortRoute(action, controller, action);
}

void ShortRoute(string action, string controller, string route)
{
    _context.MapRoute(route, route, new { action, controller });
}

With usage:

ShortRoute("About", "Home");

Which allows me to navigate to mywebsite.com/about instead of mywebsite.com/home/about

If it's not working for certain URLs it may be that the route handler is matching a different route - I believe it does depend on the order you register them

There's a good route debugging plugin you can use

https://www.nuget.org/packages/routedebugger/

It gives you a summary of all routes and which ones matched the current URL - very useful

Upvotes: 1

Related Questions