MVC4 Default route when using areas

前端 未结 8 1406
灰色年华
灰色年华 2021-02-03 12:30

I\'m trying to use areas within MVC app, I would like that the default route will be resolved to the HomeController within the admin area but it resolves to the home controller

相关标签:
8条回答
  • 2021-02-03 13:07

    Try doing this way....it will help in distinguish.Even if you dont add area="Web", its fine

    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;
    

    Same way

    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", area = "Admin", id = "" },
        new[] { "Nop.Admin.Controllers" }
    );
    
    0 讨论(0)
  • 2021-02-03 13:09

    I've tested your code for the area registration and it works and selects the right controller. However, the view resolution finds the view in the root folder, even if the right controller is used.

    To test, I used the following home index action in my areas home controller:

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

    Then my index.chstml in /Views/Home:

    Root View: @Model
    

    and my index.cshtml in /Areas/Admin/Views/Home:

    Admin Area view: @Model
    

    When run, the output is:

    Root View: Admin area home controller

    So the route makes the home controller in the admin area run, but then thew view resolution goes on and finds the root view instead of the admin view.

    So in the end, it is indeed the view selection that is wrong, so your problem is the same as in How to set a Default Route (To an Area) in MVC.

    0 讨论(0)
  • 2021-02-03 13:12

    The most straightforward way is to add a data token to your default route:

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

    Simply add

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

    to the end of your default route definition.

    0 讨论(0)
  • 2021-02-03 13:12

    This solution will broke your API route. You must have some unique name for each area, like the default area makes it:

    context.MapRoute(
             "Common_default",
             "**Common**/{controller}/{action}/{id}",
             new { action = "Index", id = UrlParameter.Optional }
    );
    

    The correct solution to default route below:

    Web area route:

    context.MapRoute(
             "Common_default",
             "Common/{culture}/{controller}/{action}/{id}",
             new {culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    

    Main route which redirect users to the "Common" area:

    routes.MapRoute(
                name: "Default",
                url: "{culture}/{controller}/{action}/{id}",
                defaults: new { culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "SMS.Sender.Areas.Common.Controllers" }
            ).DataTokens.Add("area","Common");
    
    0 讨论(0)
  • 2021-02-03 13:19

    Easiest way to route from areas from AreaRegistration Page:

    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" });
    
    0 讨论(0)
  • 2021-02-03 13:21

    In your

    RouteConfig.cs

    routes.MapRoute("redirect all other requests", "{*url}",
            new {
                controller = "UnderConstruction",
                action = "Index"
                }).DataTokens = new RouteValueDictionary(new { area = "Shop" });
    
    0 讨论(0)
提交回复
热议问题