1
votes

I have few pages that quite similar to the others but one of them doesn't work.

When I write 'http://localhost:2265/Segment/' I get annoying error message "Server Error in '/' Application. The resource cannot be found."

Other pages like 'http://localhost:2265/User/' works very well AND also 'http://localhost:2265/Segment/Create'. So Index of the Segment is the problem. I have used ASP.NET Routing Debugger and on other pages I get correct mappings, but I get this same error message "resource cannot be found" also when using debugger.. I think this indicates that Default route doesn't catch it either..

Any ideas?

Here is my MapRoute commands.

            routes.MapRoute(
            "Maintenance",
            "Maintenance/{action}",
            new { controller = "Maintenance", action = "Index", id = "" }
        );

        routes.MapRoute(
            "User",
            "User/{action}",
            new { controller = "User", action = "Index", id = "" }
        );

        routes.MapRoute(
            "Segment",
            "Segment/{action}",
            new { controller = "Segment", action = "Index", id = "" }
        );

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

Update:

Thank you for the quick reply!

I removed all routes except the default. It didn't solve the problem, but now the route list is shorter.

I have other classes inside my controller file like this:

public class SegmentFormViewModel
{
}

public class SegmentController : Controller
{
}

public class SegmentFormCreateModel : Segment
{
}

I tried to move it inside controller, but that didn't help either.

Is there any way to debug this problem?

Update:

Here is my controller (without contents of the methods)

public class SegmentController : Controller
{
    //
    // GET: /Segment/

    public ActionResult Index()
    {
    }

    //
    // GET: /Segment/Details/5

    public ActionResult Details(Guid id)
    {
    }

    //
    // GET: /Segment/Create

    public ActionResult Create()
    {
    }

    //
    // POST: /Segment/Create

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(FormCollection collection)
    {
    }

    //
    // GET: /Segment/Edit/5

    public ActionResult Edit(int id)
    {
    }

    //
    // POST: /Segment/Edit/5

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection collection)
    {
    }
}
2
You really don't need the three routes. The default route will handle all of them. Also I've just tested your routes in an ASP.NET MVC application created from scratch and it worked perfectly fine. So I guess there's something else causing you problems.Darin Dimitrov

2 Answers

4
votes

To match your /Segment/ route you will need a "SegmentController" controller class to have an "Index" action that accepts GET requests, ie not restricted with [AcceptVerbs(HttpVerbs.Post)].

As Darin has already commented, the default route would handle all the other routes you have added so you don't need the extra routes.

After update:
Your problem is probably more to do with the actions in the Segment controller. It doesn't matter what classes you have in which file. What actions do you have in the Segment controller?

After 2nd update:
Your actions look ok so I suspect the problem is in code you have not listed.
Next steps:
1. Use the router debugger already mentioned.
2. Download the MVC source so you can step through it.
Last resort: Start a brand new project and only add the Segment controller. Then keep adding related code until you find the problem.

2
votes

Use Phil Haack's RouteDebugger. It'll tell you what was matched, which often clears the problem up pretty quickly.

It's really easy to set up: drop RouteDebug.dll in your /bin folder and make this change to your App Start event:

protected void Application_Start(object sender, EventArgs e)
{
  RegisterRoutes(RouteTable.Routes);
  RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}