0

「Projects」コントローラと「accountID」という名前のパラメータを取る「Dashboard」アクションがあります。

 public ActionResult Dashboard(String accountID)
 {
     return View();
 }

次のように定義されたルートがあります。

routes.MapRoute(
    "ProjectsHome",
    "{accountID}/projects",
    new { controller = "Projects", action = "Dashboard" }
);

アイデアは、/1111/projects のような URL を持つことです。ここで、1111 は accountID を表します。URL は、プロジェクト コントローラーのダッシュボード アクションを実行します。

私が直面している問題は、 @Html.ActionLink("Projects", "Dashboard", "Projects", new { accountID = "1111" }, null)/Projects/Dashboard?accountID=1111 のような URL を生成し、/1111/projects のようなものを期待していたことです。

私の回避策は を使用すること@Url.RouteUrl("ProjectsHome", new { accountID = "1111"})ですが、なぜ Html.ActionLink が定義したルートを選択せず​​、それに応じて URL をフォーマットしないのか疑問に思っていました。

もう 1 つの興味深い事実は、コントローラーのコードの 1 つに、 return RedirectToAction("Dashboard", "Projects", new { accountID = newAccount.ID });期待どおりに URL を構築するようなものがあることです。

注:一般的な「キャッチオール」以外のルートは定義していません。ASP.NET MVC3 を使用しています。

4

2 に答える 2

0

得られた結果を再現できる唯一の方法は、「ProjectsHome」ルートを一般的な「catch-all」ルートの下に配置することです。私がそれを一般的なルートの上に置いたとき、ActionLinkはあなたが望む形でURLを生成しました。

MVCルーティングエンジンは、一致するルートテーブルが見つかるまでルートテーブルをスキャンします。つまり、キャッチオールの後にある定義済みのルートに到達することはできません。

于 2012-06-15T05:18:06.503 に答える
0

マップルートは次のように定義する必要があります -

routes.MapRoute( "ProjectsHome", "{accountID}/projects", new { controller = "Projects", action = "Dashboard", accountID = UrlParameter.Optional } );

マップ ルートで accountID を定義し忘れました。

于 2012-06-15T09:10:17.073 に答える