2

ASP.NET MVC (バージョン 3 を使用) は初めてで、期待どおりに動作しActionLinkたり動作したりできません。RouteLinkこのアプリでは、イベントに多くのアクティビティを含めることができ、次を使用してそれらにルーティングしたいと考えています。

/イベント/1/アクティビティ
/Event/1/Activity/Index (前と同じ)
/イベント/1/アクティビティ/詳細/5

これら 2 つのヘルパーによって生成される HTML は、常に次のようになります。

/イベント/1

これがコードです...

Razor HTML を表示

@Html.RouteLink("View Sessions", "SubControllerIndex",
    new { eventId = Model.Id, controller = "Activity", action = "Index" })
@Html.ActionLink("View Sessions", "Index", "Activity", new { eventId = Model.Id }, null)

ルート マッピング

routes.MapRoute(
    "SubControllerIndex",
    "Event/{eventId}/{controller}",
    new { controller = "Activity", action = "Index" },
    new { eventId = @"\d+" }
);
routes.MapRoute(
    "ActivityIndex",
    "Event/{eventId}/{controller}/{action}/{id}",
    new { controller = "Activity", action = "Index", id = UrlParameter.Optional },
    new { eventId = @"\d+", id = @"\d*" }
);
routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
    new { id = @"\d*" }
);

アクティビティ コントローラー

public ActionResult Index(long eventId)
{
    var activities = _context.Activities.Where(a => a.Event.Id == eventId).ToList();
    return View(activities);
}

ここで私が間違っていることはありますか?

4

4 に答える 4

5

ルーティング システムがルートの/Event/1代わりに生成する理由/Event/1/Activity/Index

routes.MapRoute(
   "ActivityIndex",
   "Event/{eventId}/{controller}/{action}/{id}",
   new { controller = "Activity", action = "Index", id = UrlParameter.Optional },
   new { eventId = @"\d+", id = @"\d*" }
);

これは、URL を生成するときに、システムが URL にデフォルト値を含めないためです。この場合、controller のデフォルト値は Activity で、action のデフォルト値は Index です。したがって、

@Html.RouteLink("View Sessions", "SubControllerIndex",
    new { eventId = Model.Id, controller = "Activity", action = "Index" })

/Event/1の代わりに生成され/Event/1/Activity/Indexます。リンクをクリックしても、ActivityController の Index アクション メソッドに移動する必要があります。

于 2011-06-05T08:46:54.340 に答える
1

mrydengren が指摘しているように、ActionLink および RouteLink メソッドは、デフォルトと同じパラメーターを取り除きます。URL は、指しているアクションを指す必要があります。

それでも完全な URL を使用したい場合は、デフォルト値を使用せずにルートを作成し、RouteLink を使用してそのルートとのリンクを作成できます。

// Either add this at the end as a new route, or replace the one you already have.
routes.MapRoute("ActivityIndexWithoutParams",
    "Event/{eventId/controller/action/id},
    new{},
    new{ eventId = @"\d+", id = @"\d*"}
    );

これで、RouteLink メソッドを使用して正しいルートを作成できます。

@Html.RouteLink("View Sessions", "ActivityIndexWithoutParameters",
    new {eventid = Model.Id, controller = "activity", action = "index"}
    );
于 2011-06-05T09:03:03.007 に答える
0

ルートは「貪欲」であり、最初に一致したものが処理されるため、最初のルート エントリを失う必要があることに注意してください。そうしないと、2 番目のエントリに到達できません。

それ以外の場合は問題ありません。次のようにビューにアクション リンクを追加します。

@Html.ActionLink("View Sessions", "Details", "Activity", new { eventId = 12, id = 22 }, null)

そして、リンクに正しい URL が生成されることがわかるはずです。

于 2011-06-05T11:35:59.440 に答える