2

私の MVC アプリケーションでは、デフォルト ルートが定義されています。

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new []{ "Demo.Controllers" }
);

Admin という名前の新しい Area を作成し、AdminAreaRegistration クラスにルートを追加しました。

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new { action = "Index", controller = "Home", id = UrlParameter.Optional }
    );
} 

メインの _Layout ファイルで、次のことを試みました。

@Html.RouteLink("Admin", "Admin_default")

特定の場合にのみ機能します (既に管理ページにいる場合など)。サイトの /Home/About セクションにいる場合、URL は次のように生成されます。

/Admin/Home/About

Home コントローラーの Index アクション (管理者ではなくメイン領域) にいる場合、URL は次のように生成されます。

/Admin

MVC で Areas を使用する必要があると思うように RouteLink が機能しないのはなぜですか?

4

3 に答える 3

3

また、ルートに名前を付けないことをお勧めします。作成時にルート名引数に null を渡すことで、強制的にこれを行うことができます。

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(null,
        "Admin/{controller}/{action}/{id}",
        new { action = "Index", controller = "Home", id = UrlParameter.Optional }
    );
}

その後、次のように RouteLink を使用できます。

@Html.RouteLink("Admin", 
    new { controller = "Home", action = "Index", area = "Admin" })

コメントに返信

私がそのアイデアを思いついたと言えたらいいのにと思います。これは、Steve Sanderson の MVC 本から学びました。ルート名をパラメーターとして受け取るメソッドのオーバーロードがたくさんあります (RouteLink だけでなく、RedirectToRoute なども含まれます)。ルート名を使用しないと、これらのメソッドの他のオーバーロードを使用する必要があり、IMO はより直感的で「正しく理解する」のが簡単です。

于 2012-06-29T15:16:54.923 に答える
3

@Html.RouteLink("Admin", "Admin_default")このルートは の名前のルートを使用するAdmin_defaultため、常にそのルートを使用して URL を生成します。

@Html.RouteLink("Admin", "Admin_default", new { controller = "Home", action = "Index" })

ルート値などを指定しない場合、ほとんどの MVC は現在存在する値を使用します。この場合、actionandのcontroller値が null であるため、 RouteValuesand が存在するかどうかを確認し、見つかった場合は代わりにそこにある値を使用します。

これは時々役に立ちます。たとえば{id}、ページで使用されたものと同じ値を入力したい場合などです。

URL:/home/edit/1701

@Html.RouteLink("Refresh", "Default")まったく同じ URL になります。必要に応じてオーバーライドを指定できます。

于 2012-06-29T15:00:58.487 に答える
1

ルートに名前を付けると、既存のルートに対するビューに依存関係が生じるため、お勧めしません。null値を使用することをお勧めします

于 2012-06-29T15:11:52.213 に答える