0

ASP.NET MVC ベースの Web サイトに、ID ではなくユーザー名で選択できるページを作成しようとしています。ルートは次のようにする必要があると思いました:

routes.MapRoute(
  "CustomerView", "Customer/Details/{username}",
  new { username = "" }
);

routes.MapRoute(
  "Default", "{controller}/{action}/{id}",
  new { controller = "Home", action = "Index", id = "0" }
);

しかし、HTML.Actionlink を使用するたびにhttp://mysite.com/Customer/Details?username=valuehereを取得します。次のような一般的なルートを検討しました。

routes.MapRoute(
  "CustomerView", "Customer/Details/{username}",
  new { controller="Customer", action = "Details", username = "" }
);

しかし、どちらのルートを適用するかを間違えると、より多くの問題が発生すると思います。

4

3 に答える 3

2

Customer コントローラの Details メソッドには、id パラメータの代わりに「username」パラメータがありますか?

パラメータが一致しない場合、クエリ文字列変数として追加されます。

于 2010-01-25T04:12:26.503 に答える
1

これは機能します:

routes.MapRoute(
  "CustomerView", "Customer/Details/{username}",
  new { controller="Customer", action = "Details", username = "" }
);

しかし、上記の質問で、2 番目の例で犯した間違いは、次のことを意味していました。

routes.MapRoute(
  "CustomerView", "{controller}/{action}/{username}",
  new { controller="Customer", action = "Details", username = "" }
);

これは、文字列値を渡すインスタンスごとに明確にルートを宣言する必要があることを意味します。

于 2010-01-25T04:12:18.017 に答える
1

私は質問を完全に理解しているかどうか確信が持てません...

  1. 3 番目のトークンが文字列である URL を処理する1 つのルート{controller}/{action}/{username}、文字列の "username" 引数があるアクションの照合、および

  2. 3番目のトークンが整数であるURLを処理する別のルート{controller}/{action}/{id}、整数の「id」引数があるアクションに一致しますか?

その場合は、ルート制約を指定する 4 番目の引数を取るMapRoute のオーバーロードを確認してください。次のようなことができるはずです。

routes.MapRoute(
    "CustomerView", "{controller}/{action}/{username}",
    new { controller="Customer", action = "Details", username = "" }
    new { username = @"[^0-9]+" }
);

この (テストされていない) 制約により、{username} ルートは、3 番目のトークンに少なくとも 1 つの数字以外の文字が含まれるすべてのものと一致するはずです。

もちろん、ユーザー名を完全に数字で構成することが合法である場合、これは機能しない可能性があります。その場合、ID の代わりにユーザー名を受け入れるアクションごとに特殊なルートを作成する必要がある場合があります。

于 2010-01-25T04:29:35.380 に答える