アクションのリスト(例:Send)がよく知られており、それらの(アクション)名をID値と同じにすることができない場合は、カスタムConstraintImplementationを使用できます。
public class MyRouteConstraint : IRouteConstraint
{
public readonly IList<string> KnownActions = new List<string>
{ "Send", "Find", ... }; // explicit action names
public bool Match(System.Web.HttpContextBase httpContext, Route route
, string parameterName, RouteValueDictionary values
, RouteDirection routeDirection)
{
// for now skip the Url generation
if (routeDirection.Equals(RouteDirection.UrlGeneration))
{
return false; // leave it on default
}
// try to find out our parameters
string action = values["action"].ToString();
string id = values["id"].ToString();
// id and action were provided?
var bothProvided = !(string.IsNullOrEmpty(action) || string.IsNullOrEmpty(id));
if (bothProvided)
{
return false; // leave it on default
}
var isKnownAction = KnownActions.Contains(action
, StringComparer.InvariantCultureIgnoreCase);
// action is known
if (isKnownAction)
{
return false; // leave it on default
}
// action is not known, id was found
values["action"] = "Index"; // change action
values["id"] = action; // use the id
return true;
}
また、ルートマップ(デフォルトのマップの前-両方を指定する必要があります)は、次のようになります。
routes.MapRoute(
name: "DefaultMap",
url: "{controller}/{action}/{id}",
defaults: new { controller = string.Empty, action = "Index", id = string.Empty },
constraints: new { lang = new MyRouteConstraint() }
);
概要:この場合、「action」パラメーターの値を評価しています。
- 1)アクションと2)IDの両方が提供されている場合、ここでは処理しません。
- また、これが既知のアクション(リスト内、または反映されている...)である場合も同様です。
- アクション名が不明な場合のみ、ルート値を変更しましょう。アクションを「インデックス」に設定し、アクション値をIDに設定します。
注:action
名前とid
値は一意である必要があります...そうすればこれは機能します