can I have domain.com/action/id as well as domain.com/controller/action?
how would I regis开发者_开发技巧ter these in the route-table?
Is ID always guaranteed to be a number? If yes, then you could use RouteConstraints:
routes.MapRoute("ActionIDRoute",
"{action}/{id}",
new { controller = "SomeController" },
new {id= new IDConstraint()});
routes.MapRoute("ControllerActionRoute",
"{controller}/{action}",
new {}); // not sure about this last line
The IDConstraint class looks like this:
public class IDConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route,
string parameterName, RouteValueDictionary values,
RouteDirection routeDirection)
{
var value = values[parameterName] as string;
int ID;
return int.TryParse(value,out ID);
}
}
Basically what is happening is that you have two identical routes here - two parameters, so it's ambigous. Route Constraints are applied to parameters to see if they match.
So:
- You call http://localhost/SomeController/SomeAction
- It will hit the ActionIDRoute, as this has two placeholders
- As there is a constraint on the id parameter (SomeAction), ASP.net MVC will call the Match() function
- As int.TryParse fails on SomeAction, the route is discarded
- The next route that matches is the ControllerActionRoute
- As this matches and there are no constraints on it, this will be taken
If ID is not guaranteed to be a number, then you have the problem to resolve the ambiguity. The only solution I am aware of is hardcoding the routes where {action}/{id} applies, which may not be possible always.
Yes, you can add a new rule above the default rule and provide a default value for the controller.
routes.MapRoute(
"MyRole", // Route name
"{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
The sample routs all actions to the "Home" controller.
精彩评论