I’m working on my first ASP.NET MVC 3 application and I’ve got a couple of actions defined to handle adding/removing an ice cream from a menu. They look like so:
[HttpPost]
public PartialViewResult AddMenuIceCreamMapping(int iceCreamId, int menuId)
[HttpPost]
public PartialViewResult RemoveMenuIceCreamMapping(int iceCreamId, int menuId)
In order for these actions to not result in a 404 error, I went into the Global.asax.cs file and added the following:
routes.MapRoute(
"AddMenuIceCreamMapping", // Route name
"IceCream/AddMenuIceCreamMapping/{iceCreamId}/{menuId}", // URLwith parameters
new
{
controller = "IceCream",
action = "AddMenuIceCreamMapping",
iceCreamId = UrlParameter.Optional,
menuId = UrlParameter.Optional
}
);
routes.MapRoute(
"RemoveMenuIceCreamMapping", // Route name
"IceCream/RemoveMenuIceCreamMapping/{iceCreamId}/{menuId}", // URLwith parameters
new
{
controller = "IceCream",
action = "RemoveMenuIceCreamMapping",
iceCreamId = UrlParameter.Optional,
menuId = UrlParameter.Optional
}
);
and those work, meaning I can click an Add or Remove button on my page and add or remove an ice cream/menu mapping. Great. But I’m expecting that there will be more situations like this and I can see this routes container having more entries such as these. And to my novice web programmer eye, it seems a bit clunky and I begin to think that perhaps I’m going about this the wrong way. Am I? Is there a better way to approach this so that I don’t end up doing the “go create some action that takes N parameters and then go add a route” thing. Any suggestions here?
You can use placeholders in your mappings to deal with this… Instead of what you’ve got above, you could use this (note that I don’t specify a default):
And if you have to add a route that takes three parameters, you extend the idea:
In a controller for the two parameter route, the code would look like this (for a contrived sample):
One final thing to note is that you can change the naming to match a pattern you might have. In the first example, instead of
id1andid2you might haveentityIdandrelatedIdor something similar.