A Bogus
A Bogus

Reputation: 3930

ASP.NET MVC C# routes.MapRoute not working

I am altering an ASP.NET, MVC, C# application but a routes.MapRoute entry isn't working as expected. In my Global.asax.cs file I have the following two routes -

routes.MapRoute(
            "MyRoute1", // Route name
            "{controller}/{action}/{something}/{name}/{id}/{myParameterA}", 
            new { controller = "MyController", action = "MyActionA", category = "something", name = "name", id = "id", myParameterA = "myParameterA" });


routes.MapRoute(
            "MyRoute2", // Route name
            "{controller}/{action}/{something}/{name}/{id}/{myParameterB}", 
            new { controller = "MyController", action = "MyActionB", category = "something", name = "name", id = "id", myParameterB = UrlParameter.Optional } );

The code in my controller looks like this -

    public ActionResult MyActionA(string something, string name, string id, string myParameterA)
    {
       //do cool stuff!
    }

    public ActionResult MyActionB(string something, string name, string id, string myParameterB)
    {
       //do awesome stuff!
    }

When I call MyActionB, the final parameter myParameterB is coming into the Controller as null even when the parameter is in the URL - (example: /MyController/MyActionB/aThing/aName/123/456).

I do want the final parameter ('456' in my above example) to be optional.

MyActionA is working fine.

Any suggestions would be appreciated! Also, is there a good reference out there on how routes.MapRoute works? Thank you!

Upvotes: 2

Views: 1432

Answers (2)

levelnis
levelnis

Reputation: 7705

This is because there is nothing to distinguish between those 2 routes once you replace the parameters with strings in the route itself. If you add a static part to the routes you should be able to differentiate between them.

routes.MapRoute(
        "MyRoute1", // Route name
        "{controller}/{action}/{something}/{name}/{id}/firstroute/{myParameterA}", 
        new { controller = "MyController", action = "MyActionA", category = "something", name = "name", id = "id", myParameterA = "myParameterA" });


routes.MapRoute(
        "MyRoute2", // Route name
        "{controller}/{action}/{something}/{name}/{id}/secondroute/{myParameterB}", 
        new { controller = "MyController", action = "MyActionB", category = "something", name = "name", id = "id", myParameterB = UrlParameter.Optional } );

See if that works.

Upvotes: 1

user369142
user369142

Reputation: 2915

Not sure but I think swap the two around, when you set "myParameterA = "myParameterA"" on the first, you're assigning a default value, when you pass /MyController/MyActionB/aThing/aName/123/456 the url is mapped to the first, but the number 456 is not compatible with the default string value - and so is passed as null.

EDIT: oh and for a good reference, the Apress Pro MVC 3 has an excellent chapter on this - Safari Informit.

Upvotes: 0

Related Questions