1

DefaultControllerを呼び出すコントローラーがあります。このコントローラーの内部には、静的ページに相当するものについてのビューがあります。

URLはwww.site.com/Default/PageNameのようになります

これらのURLを次のようにフォーマットするルートを作成することは可能ですか?

www.site.com/PageName

これらのそれぞれにコントローラーを作成することは避けたいと思います。別の方法は、ルートに.aspxページを作成することですが、これらのページのルートを作成できますか?

www.site.com/PageName.aspxはwww.site.com/PageNameになりますか?

ありがとう!

4

2 に答える 2

3

次のように、PageNameアクションの明示的なルートを作成できます。DefaultController

routes.MapRoute(
    "PageName",
    "pagename",
    new { controller = "DefaultController", action = "PageName" }
);

このルートは、デフォルトのMVCルートの前に配置する必要があります。このアプローチの最大の欠点は、静的ページごとに1つのルートを作成する必要があることです。

別のアプローチは、デフォルトのMVCルートのにルートを追加することです。

routes.MapRoute(
    "DefaultController",
    "{page}/{*path}",
    new { controller = "DefaultController", action = "{page}" }
);

このアプローチの欠点は、このルールが、通常は404を返すURLも含めて、すべてのURLを処理することです。

于 2010-02-07T06:08:44.817 に答える
1

最初のアプローチ

アクションをキャッチするルートを作成します。

routes.MapRoute(
    "Catcher1",
    "{action}",
    new { controller = "Default", action = string.Empty });

ただし、これは、デフォルト コントローラーで同じ数のコントローラー アクションを作成する必要があることを意味します。

2 番目のアプローチ

それも避けて、代わりにコントローラーとアクションを 1 つだけにしたい場合は、次のようにルートを記述します。

routes.MapRoute(
    "Catcher2",
    "{path}",
    new { controller = "Default", action = "PageName", path = string.Emtpy },
    new { path = @"[a-zA-Z0-9]+" });

このルートはルート制約も定義するため、最初のルート セグメントに実際に何かがあるルートのみをキャッチします。この制約を定義して、必要なリクエストのみをキャッチすることができます (つまりpath = "Result|Search|Whatever") 。

次に、次のDefaultControllerようなものがあります。

public ActionResult PageName(string path)
{
    // code goes here
}

2 番目のアプローチは非常に実行可能に思えますが、すべてのロジックがこのコントローラー アクションを通過する必要があるため (この種の要求の場合)、お勧めしません。これらのアクションを論理的なものに分けたほうがよいでしょう。実際に同じことを行うもの (switchステートメントの束などを持たないため) は、別々のルートで定義されます (単一のルートを使用して実行できない場合)。

于 2010-02-07T12:25:19.510 に答える