user208662
user208662

Reputation: 10997

Incorrect Routing is ASP.NET MVC

I don't know why I have such problems with ASP.NET MVC routing. I wish there was a tool that showed me which routes I had currently setup. Regardless,

In my global.asax.cs file I have the following:

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

  routes.MapRoute(
    "SignUp", // Route name
    "account/{controller}/{action}", // URL with parameters
    new { controller = "Home", action = "Register" } // Parameter defaults
  );

  routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
  );
}

I have the following defined in HomeController.cs

public ActionResult Register()
{
  return View();
}

I was expecting to be able to access this page by visiting /account/register in my browser. However, I continue to get a 404. What am I doing wrong?

Upvotes: 0

Views: 639

Answers (3)

StanK
StanK

Reputation: 4770

replace

routes.MapRoute(
    "SignUp", // Route name
    "account/{controller}/{action}", // URL with parameters
    new { controller = "Home", action = "Register" } // Parameter defaults
  );

with

routes.MapRoute(
    "SignUp", // Route name
    "account/{action}", // URL with parameters
    new { controller = "Home" } // Parameter defaults
  );

This will mean /account/register will route to the Register action on the Home controller. It will also mean that action links and other links you generate via @Html.ActionLink("Register", "Register", "Home") will generate the URL /account/register

Think of the 'URL with paramters' as a pattern that the URL will be matched against.

The problem with your original route map is that it is looking for a URL like this /account/controllername/actionname. So, when you go /account/register - it is taking register as the controller name, and taking the default action name (in this case register) - and as the 'register' action does not exist in the 'register' controller - you are getting a 404.

UPDATED I updated my suggested route as per Robert's comments.

It is also worth noting, as Robert states, that this whole thing could be made more simple by making a 'Account' controller, and moving the 'Register ' action there. Then you could delete the 'SignUp' route, and just use default routing. If you thought about it, you'd agree that this would be a better place for a 'Register' action than the 'Home' controller.

Upvotes: 1

ASetty
ASetty

Reputation: 114

Try using this nugget package http://nuget.org/packages/Glimpse.Mvc3 You can find more info about glimpse on http://getglimpse.com/

Upvotes: 0

SLaks
SLaks

Reputation: 887285

/Account/Register matches your first route.

The word Register is matched to the {controller}, so it looks for a controller named RegisterController.

Upvotes: 3

Related Questions