1

アクション名のみを使用してアクセスすることで Home コントローラーを機能させることができましたが、別のコントローラーを追加して、Home ルート宣言で同じように別のルート宣言を追加して同じことを試みるとすぐに、すべてのルートがデフォルトは Home コントローラーです。

routes.MapRoute("HomeTest", "{action}/{id}", new { controller = "Home", action = "TestHome", id = UrlParameter.Optional });
routes.MapRoute("TestTest", "{action}/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional });


public class HomeController : Controller
{
    public ActionResult TestHome(int? id)
    {
        return View();
    }
}

public class TestController : Controller
{
    public ActionResult Test(int? id)
    {
        return View();
    }
}

URLにコントローラー名を含めずに両方のコントローラーにアクセスする方法はありますか?

それが違いを生む場合は、デフォルトルートも含まれています。この2つのルートの下にあります。

4

2 に答える 2

3

MVC のルートは、追加した順序で比較されます。コード サンプルの場合、これはすべての要求が最初に "HomeTest" ルートと比較されることを意味するため、すべての一致はそのルートに従います。「TestTest」ルートの形式はまったく同じです。つまり、すべての一致で「HomeTest」ルートがすでに使用されているため、このルートは使用されません。コントローラー名を使用せずにコントローラーのアクションに到達したい場合は、使用するコントローラーを伝えるためにルートに何かが必要です。これは実際のコントローラー名である必要はありません。次のようにできます。

routes.MapRoute("TestTest", "keyWord/{action}/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional });
routes.MapRoute("UsersTest", "otherKeyWord/{action}/{id}", new { controller = "Users", action = "Test", id = UrlParameter.Optional });

ここで、キーワードは基本的にコントローラー名を隠すためのエイリアスとして機能します。さらに一歩進んで、アクション名をマスクすることもできます。これにより、1 つの URL ルートで複数のコントローラーを使用できるようになります。

routes.MapRoute("TestTest", "test/key1/{id}", new { controller = "Test", action = "Test", id = UrlParameter.Optional });
routes.MapRoute("UsersTest", "test/key2/{id}", new { controller = "Users", action = "Test", id = UrlParameter.Optional });

このようなことを行うと、ユーザーがサイトをナビゲートし、リンクがどこに移動するかを理解するのに役立つ、より整然とした URL 構造をユーザーに提供できます (ブックマークにも便利な可能性があります)。ただし、手動で URL を定義する必要があることを意味します。仕事。

于 2013-02-18T12:12:04.703 に答える