1

問題を探しましたが、解決策が見つかりませんでした...

BlogControllerがあり、次のルートを別のアクションに一致させたいと思います。

/blog/
/blog/rss
/blog/tags/tagName

ただし、次のような他のURLと一致させたいです。

/blog/my-post
/blog/other-post

投稿アクションに。

で試してみました

routes.MapRoute("Blog",
"blog/{action}/{param}",
new { controller = "Blog", action = "Index", param = UrlParameter.Optional });

routes.MapRoute("BlogPost",
"blog/{slug}",
new { controller = "Blog", action = "post" });

しかし、2番目のルートは一致しません。

何か案は?

4

1 に答える 1

2

最初のルートは、の形式のすべてのURLとすでに一致していblog/slugます。

ルートを解決するとき、ASP.NET MVCは最初の一致を使用しようとし、そのメソッドを取得するアクションがない場合でも使用します。ASP.NET MVCのルーティングは、まだ次のルートを試行しません。

したがって、ルートでは、URLは最初のURLと一致し、MVCはクラスのメソッドblog/my-first-articleを探します。my-first-actionBlogController

解決策1

次のように、メソッドごとに個別のルートを定義できます。

routes.MapRoute("Blog index",
    "blog",
    new { controller = "Blog", action = "Index" });

routes.MapRoute("Blog RSS feed",
    "blog/rss",
    new { controller = "Blog", action = "Rss" });

routes.MapRoute("Posts by tag",
    "blog/Tags/{params}",
    new { controller = "Blog", action = "Tags" });

routes.MapRoute("BlogPost",
    "blog/{slug}",
    new { controller = "Blog", action = "post" });

解決策2

制約を使用し{action}て、最初のルートでの有効な値を定義できます。

routes.MapRoute("Blog",
    "blog/{action}/{param}",
    new { controller = "Blog", action = "Index", param = UrlParameter.Optional },
    new { action = 'index|rss|tags' });

routes.MapRoute("BlogPost",
    "blog/{slug}",
    new { controller = "Blog", action = "post" });

制約は正規表現の形式です。

于 2013-02-12T12:20:00.470 に答える