0

この形式で URL をマップするにはどうすればよいですか

http://DOMAIN/{userID}

しかし、デフォルトのフォーマット {controller}/{action}/{id} をオーバーライドしませんか??

私はこれを試しましたが、うまくいきません:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute("Users", "{userID}", new { controller = "Users", action = "GetUser" });
4

2 に答える 2

0

これをデフォルトルートの前に挿入

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 の呼び出しを行う代わりに、キャッシュされたバージョンのみを使用します。

于 2014-06-02T17:13:36.357 に答える