MVC4使用区域时的默认路由

时间:2013-06-20 17:32:54

标签: asp.net-mvc-4

我试图在MVC应用程序中使用区域,我希望默认路由将被解析为管理区域内的HomeController,但它会解析为根站点中的家庭控制器。 我添加了admin 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();
       }

   }
}

知道为什么它不能正确解决? 谢谢

8 个答案:

答案 0 :(得分:37)

最直接的方法是将数据令牌添加到默认路由:

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

只需添加

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

到默认路由定义的末尾。

答案 1 :(得分: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

运行时,输出为:

  

Root View:管理区域主控制器

因此路由使管理区域中的主控制器运行,但随后视图分辨率继续并找到根视图而不是管理视图。

所以最后,视图选择确实是错误的,因此您的问题与How to set a Default Route (To an Area) in MVC中的问题相同。

答案 2 :(得分:6)

此解决方案将破坏您的API路线。 您必须为每个区域指定一些唯一的名称,例如默认区域:

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

以下默认路线的正确解决方案:

网络区域路线:

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

将用户重定向到“公共”区域的主要路线:

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");

答案 3 :(得分:2)

尝试这样做....它将有助于区分。即使你不添加区域=" 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" }
);

答案 4 :(得分: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}
                );

答案 5 :(得分: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" });

答案 6 :(得分:0)

在你的

RouteConfig.cs

routes.MapRoute("redirect all other requests", "{*url}",
        new {
            controller = "UnderConstruction",
            action = "Index"
            }).DataTokens = new RouteValueDictionary(new { area = "Shop" });

答案 7 :(得分:0)

默认路由是默认路由,MVC首先会调用,因为在MVC中首先指定了哪条路由,它会像那样调用