12

従来のルーティングのデフォルトは、これらの URL にアクセスでき、常に同じアクションで終わることを意味していました。

/
/Home
/Home/Index

しかし、今日は次の行に何かを書きます。

[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
    public ActionResult Index() {}

    public ActionResult ...
}

しかし、このルーティング定義は決して同じではありません。

/           (fails)
/Home       (works)
/Home/Index (works)

したがって、上位コードを次のように変更すると、

[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
    [Route("~/")]
    public ActionResult Index() {}

    public ActionResult ...
}

しかし、処理を逆さまにします。

/           (works)
/Home       (fails)
/Home/Index (fails)

宣言型コードをより冗長にして、昔ながらのルーティングメカニズムとして機能させることができます。

[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
    [Route("~/")]
    [Route("~/Home")]
    [Route("~/Home/Index")]
    public ActionResult Index() {}

    public ActionResult ...
}

これは、3 つの異なるルートすべてで機能します。

質問

もちろん、この問題は、コントローラーとアクションをデフォルト設定するまさにアプリケーションのデフォルト アクションに関連しています。これが唯一の方法なのだろうか?期待どおりに動作させるための、より冗長なコードの方法はありますか?

4

2 に答える 2

12

ええ、そうです..あなたが持っているのは、ここで行う方法です...

ここでコードを少し変更しました。

[RoutePrefix("Home")]
[Route("{action}")]
public class HomeController
{
   [Route("~/")]    // GET /
   [Route]          // GET /Home
   [Route("Index")] // GET /Home/Index
   public ActionResult Index() {}

   public ActionResult ...
}

いくつかの詳細:
1. 最初のケースは従来のルーティングとまったく同じではありません。この場合Home、従来のルーティング オプションとは異なるリテラル セグメントがあるためです{controller}/{action}/{id} and controller = Home, action=Index,id=optional
2.Routeアクションで属性が使用されている場合、Controller の属性が有効にならない場合、2 番目のケースが設計上予想されます。

于 2013-12-11T17:46:21.453 に答える
0

今すぐSEOのために、このような単一のURLを意味する正規のURLを使用する必要があります

public class HomeController
{
   [Route("~/")]    // GET /
   public ActionResult Index() {}

   public ActionResult ...
}

そのため、ホームコントローラーはルートでのみアクセスできます

于 2016-01-26T03:39:05.997 に答える