9

MVC アプリ内の領域を使用しようとしています。デフォルト ルートが管理領域内の HomeController に解決されることを望みますが、ルート サイトのホーム コントローラーに解決されます。管理者 HomeController の名前空間を追加しましたが、それでもルート HomeController に解決されます。

私のルート設定:

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

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new {controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] {"MvcApplicationAreas.Areas.Admin.Controllers"}

        );
    }
}

管理エリアルート

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Admin";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

HomeController - 管理エリア

namespace MvcApplicationAreas.Areas.Admin.Controllers
{
   public class HomeController : Controller
   {

       public ActionResult Index()
       {
           return View();
       }

   }
}

なぜそれが適切に解決されないのか考えていますか? ありがとう

4

8 に答える 8

39

最も簡単な方法は、データ トークンをデフォルト ルートに追加することです。

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new {controller = "Home", action = "Index", id = UrlParameter.Optional }
).DataTokens.Add("area", "Admin");

追加するだけ

.DataTokens.Add("area", "[your area name]");

デフォルトルート定義の最後まで。

于 2013-12-26T18:48:08.273 に答える
9

エリア登録用のコードをテストしたところ、正しく機能し、適切なコントローラーが選択されました。ただし、ビューの解像度は、正しいコントローラーが使用されている場合でも、ルート フォルダーでビューを検索します。

テストするために、自分のエリアのホーム コントローラーで次のホーム インデックス アクションを使用しました。

public ActionResult Index()
{
    return View(model: "Admin area home controller");
}

次に、/Views/Home の index.chstml:

Root View: @Model

/Areas/Admin/Views/Home にある私の index.cshtml:

Admin Area view: @Model

実行すると、出力は次のようになります。

ルート ビュー: 管理エリア ホーム コントローラー

そのため、ルートによって管理領域のホーム コントローラーが実行されますが、ビューの解決が進み、管理ビューではなくルート ビューが検出されます。

結局、間違っているのは実際にはビューの選択であるため、問題はHow to set a Default Route (To an Area) in MVCと同じです。

于 2013-06-23T08:09:57.063 に答える
2

このようにしてみてください....区別するのに役立ちます.area="Web"を追加しなくても問題ありません

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", area="Web", id = UrlParameter.Optional },
    new[] { "Nop.Web.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;

同じ方法

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", area = "Admin", id = "" },
    new[] { "Nop.Admin.Controllers" }
);
于 2016-04-15T19:50:36.467 に答える
1

既定のルート ホーム コントローラーに Index アクション メソッドを追加します。Index アクション メソッドでは、デフォルト エリアのリダイレクトに「return redirecttoaction」ステートメントを使用します。

    public ActionResult Index()
    {
        return RedirectToAction("Dashboard", "Home", new {area = "Home"});
    }

デフォルトルートは

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new {controller = "Home", 
action = "Index", id = UrlParameter.Optional}
                );
于 2016-01-04T10:01:17.223 に答える
0

あなたの

RouteConfig.cs

routes.MapRoute("redirect all other requests", "{*url}",
        new {
            controller = "UnderConstruction",
            action = "Index"
            }).DataTokens = new RouteValueDictionary(new { area = "Shop" });
于 2016-01-06T14:26:21.167 に答える
0

AreaRegistration ページからエリアからルーティングする最も簡単な方法:

context.MapRoute("MainDefault", "Main/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } , new[] { "Namespace.To.Controllers" });

context.MapRoute("ClearPath", "", new { controller = "Home", action = "Index" }, new[] { "Namespace.To.Controllers" });
于 2015-06-10T16:12:39.797 に答える