これをデフォルトルートの前に挿入
routes.MapRoute("Users", "{userID}", new { controller = "Users", action = "GetUser", userID=UrlParameter.Optional });
次に、メソッド GetUseruserID
には、ルート ハンドラーが適切にルーティングできるようにするための名前付きパラメーターが必要です。
アップデート :
public class UsernameUrlConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values,
RouteDirection routeDirection)
{
if (values[parameterName] != null)
{
// check if user exists in DB
// if it does, return true
}
return false;
}
}
あなたのルートで:
routes.MapRoute("Users",
"{userID}",
new { controller = "Users", action = "GetUser" },
new {IsUser=new UsernameUrlConstraint()}
);
これは毎回DBにヒットすることに注意してください。そのため、ユーザー名を保存する場所にメモリキャッシュ(memcached、または.netメモリキャッシュ)を実装し、それが存在するかどうかを防ぐことをお勧めします。存在するユーザーからの db ヒットのみですが、存在しないユーザーに対してはヒットします。たとえば、誰かがユーザー X に 1000 回アクセスすることを決定した場合、この方法では、1000 db の呼び出しを行う代わりに、キャッシュされたバージョンのみを使用します。