Вы можете взглянуть на следующую запись в блоге , которая иллюстрирует одну технику, которая позволит вам достичь этого. Он использует пользовательский ActionNameSelectorAttribute .
Другая возможность, если вы действительно хотите сделать это глобально, - написать собственный маршрут, например:
public class MyRoute : Route
{
public MyRoute(string url, object defaults)
: base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
{ }
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var rd = base.GetRouteData(httpContext);
var action = httpContext.Request["action"];
if (rd != null && !string.IsNullOrEmpty(action))
{
rd.Values["action"] = action;
}
return rd;
}
}
и затем зарегистрируйтесь:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(
"Default",
new MyRoute(
"{controller}/{id}",
new { controller = "Home", id = UrlParameter.Optional }
)
);
}
Теперь, когда вы запросите /home?action=about
, будет выполнено действие About
контроллера Home
. Очевидно, что если вы пропустите параметр action
в запросе, вы получите исключение, поскольку маркер маршрута action
должен всегда указываться, иначе вызывающий действие не будет знать, какое действие выполнить.