0

これは私の最初の ASP MVC プロジェクトなので、これを行う方法がわかりません。

管理者コントローラーを持つ管理者というセクションがあります。私はこれを単にインデックスページに使用しています。

管理セクションには、さまざまなセクションがあります。会社と事業部門としましょう

独自の CompanyController と LineOfBusinessController のすべてを処理したい

ただし、ルートに Admin というプレフィックスを付けたいと思っています。管理者/会社、管理者/会社/追加

これは、デフォルトルートの前にルートを追加することでこれを達成しました

routes.MapRoute(
            name: "Admin",
            url: "Admin/{controller}/{action}/{id}",
            defaults: new { controller = "Admin", action = "Index", id = UrlParameter.Optional }
        );

問題は、すべてのルートがデフォルトよりもこれを選択することです。つまり、他のすべてが管理者/セクション、つまり管理者/ホームなどになります.....

ActionLink の代わりに Html.RouteLink を使用してみましたが、URL は正しくフォーマットされていましたが、Admin/Company に移動すると、Company が AdminController にあると想定されているため、見つかりません。

これを適切にルーティングするにはどうすればよいですか?

編集

ここに私のルートと私のリンクがあります

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        routes.MapRoute(
            name: "Admin",
            url: "Admin/{controller}/{action}/{id}",
            defaults: new { controller = "Admin", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );            
    }

リンク

<li>@Html.ActionLink("Home", "Index", new { controller = "Home" }, ViewBag.SelectedNav == "Home" ? new { @class = "active" } : null)</li>

リンクは /Admin/Home になります

アップデート

私が最終的に探索し、最終的にエリアを使用することになったので、ここで答えをマークしませんでした。1つの回答で提案されましたが、残りの回答は正しくないため、誤解を招きたくありませんでした. しかし、エリアの提案をありがとう

4

2 に答える 2

0

リンクの動作がどうあるべきかわからないので、私が提案できる最善のことは、ルートをデバッグし、どのルートがどのURLを処理しているかを確認することです。

1)Visual Studioに移動し、RouteDebuggerをインストールします

PM>インストール-パッケージroutedebugger

2)グローバルファイルにコードを追加します

protected void Application_Start(object sender, EventArgs e)
{
  RegisterRoutes(RouteTable.Routes);
  RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}

3)サイトを運営し、疑わしいリンクをリクエストします。

4)結果を確認し、それに応じて変更します


編集:RouteDebuggerv2がRouteMagicになったかのように表示ます

PM>インストール-パッケージRouteMagic

そして、あなたはgithubでソースコードを見つけることができます

于 2012-08-17T14:45:29.690 に答える
0

特定のルーティングの下に一般的なルーティングを配置します。ルーティング定義の順序は重要です。MVC が要求に一致するルートを見つけると、残りは処理されません。

routes.MapRoute(
            name: "Admin",
            url: "Admin/{controller}/{action}/{id}",
            defaults: new { controller = "Admin", action = "Index", 
                                               id = UrlParameter.Optional }
        );

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

また、このシナリオではエリアを使用することをお勧めします。管理者/通常ユーザーなどのさまざまなセクションでアプリを構成する場合は、より良いアプローチです.

于 2012-08-17T14:23:17.343 に答える