これをさらに一歩進めて、3 つの別々のルートを登録する必要がないように、ルート制約を作成する方法を示したいと思いました。
次の記事をガイドとして使用すると、指定するコントローラーのリストに対して現在のルート コントローラーを検証する制約を作成できます。
http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-custom-route-constraint-cs
だからここにルート制約のある私のクラスがあります:
public class ControllerConstraint : IRouteConstraint
{
private string[] _controllers;
public ControllerConstraint() : this(null) { }
public ControllerConstraint(string[] controllers)
{
_controllers = controllers;
}
#region IRouteConstraint Members
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
string currentController = values.ContainsKey("controller")? values["controller"].ToString() : null;
return _controllers != null //The list of controllers passed to the route constraint has at least one value in it
&& !String.IsNullOrEmpty(currentController) //The current route data has a controller in it to compare against
&& (from c in _controllers where c.Equals(currentController,StringComparison.CurrentCultureIgnoreCase) select c).ToList().Count > 0; //We find a match of the route controller against the list of controllers
}
#endregion
}
そこから、Globa.asax にルートを登録する方法を変更するだけです。
routes.MapRoute(
"Action-less Route", // Route name
"{controller}/{id}", // URL with parameters
new { controller = "Questions", action = "Index", id = UrlParameter.Optional}, //Parameter defaults
new {isController = new ControllerConstraint(new string[] {"Questions","Users","Tags"})} //Route Constraint
);
さらに一歩進んで、{id} が次のような追加のルート制約を持つ数値であることを検証することもできます。
http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs