2

更新 - 2009 年 1 月 21 日:

これを適度にうまく機能させることができた唯一の方法は、追加のパス情報を持つルートを作成することです...つまり、http://company.com/myDepartment/myTeam/action/idの代わりに、ルートに必要なものhttp://company.com/department/myDepartment/team/myTeamなどのパスを処理するように構築されます。

更新終了 - 2009 年 1 月 21 日:

同じコントローラー/ビューにルーティングできるようにするために必要な URL 規則が 2 つあります。

http://team.department.company.com/Action/id

http://department.company.com/Action/id

http://company.com/Action/id

部門/チームのエイリアスが Uri のホスト名に含まれているため、上記の処理は非常に簡単です。

ただし、次のことを実装したい場合、満足に機能させることができませんでした。

http://company.com/department/team/Action/id

http://company.com/department/Action/id

http://company.com/Action/id

私が定義したルートは次のとおりです。

routes.MapRoute("departmentAndTeam1", "{departmentId}/{teamId}/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });

routes.MapRoute("departmentAndTeam2", "{departmentId}/{teamId}/{controller}/{action}", new { controller = "Home", action = "Index" });

routes.MapRoute("departmentAndTeam3", "{departmentId}/{teamId}/{controller}", new { controller = "Home", action = "Index" });

routes.MapRoute("department", "{department}/{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = ""});

routes.MapRoute("departmentAndTeam4", "{departmentId}/{teamId}/", new { controller = "Home", action = "Index"});

routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });

私が抱えている問題は、コントローラーのすべてのアクション メソッドが departmentId と teamId パラメーターを必要とすることです。OnActionExecuting イベント ハンドラーで取得したベース コントローラー クラスの部門/チーム ID 値を「前処理」できるようにしたいだけです。私は間違った木を吠えていますか?独自の Mvc Route ハンドラーを実装する必要がありますか?

注: これはレガシー アプリを置き換えるものであり、URL 形式を保持/維持する必要があります。

編集: まず、これまでの応答に感謝します。私が受け取った回答に基づいて、私はある点で十分に明確ではなかったと思います. これは(大まかに)私のコントローラーがどのように見えるかです:

public class ControllerBase : Controller
{
    DepartmentDTO department;
    TeamDTO team;
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        PopulateDept(filterContext.ActionParameters("departmentId");
        PopulateTeam(filterContext.ActionParameters("teamId");
    }
}

ただし、このスキームでは、このクラスから継承する (そして上記のルートで適切にルーティングされる) すべてのコントローラーは、アクション ハンドラーで (冗長/不要であると私が認識しているもの) パラメーターを期待します。各ハンドラーがこれらの「追加の」パラメーターを必要とすることを避けたいので、提案を探しています。

ありがとう!-ジョルジオ

4

2 に答える 2

2

まず、departmentAndTeam2 や departmentAndTeam3 は必要ありません。departmentAndTeam1 は、コントローラー、アクション、および ID のデフォルトを持っているため、それを処理できます。

私が気付いたもう 1 つのことは、サンプル URL のいずれにもコントローラーが指定されていないことです。その場合は、ルートから除外し、デフォルトのままにしておきます。例えば

URLの

http://company.com/department/team/Action/id

ルートを使用する

routes.MapRoute("departmentAndTeam1", "{departmentId}/{teamId}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });

URL に記載されていないため、「コントローラー」が常に「ホーム」になることに注意してください。

部門 ID とチーム ID を指定したくないアクションと URL については、他のすべてのルートを通過し、デフォルト ルートのみを使用する必要があります。そうでないということは、以前のルートの 1 つに引っかかっているということです。以前のルートの問題を修正すれば、追加の ID が必要になる問題も修正されるはずです。

最後に、まだ問題がある場合は、Phil Haacked http://haacked.com/archive/2008/03/13/url-routing-debugger.aspxのような MVC ルート デバッガーを使用してみてください。いくつかのルートの問題を解決するために使用しましたが、実際に実行していることとランタイムを確認することは非常に役立ちます。

于 2009-01-16T00:54:44.857 に答える
0

これはどうですか (これらの 3 つの特定の URL マッピング以外にどのような要件があるかわからないため、テストしていません)?

routes.MapRoute("1", "{department}/{team}/{action}/{id}", new { controller = "Home" });
routes.MapRoute("2", "{department}/{action}/{id}", new { controller = "Home" });
routes.MapRoute("3", "{action}/{id}", new { controller = "Home" });
于 2009-01-16T01:11:43.747 に答える