MVC4使用区域时的默认路由

spo*_*oti 9 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"}

        );
    }
}
Run Code Online (Sandbox Code Playgroud)

管理区域路线

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 }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

HomeController - 管理区域

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

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

   }
}
Run Code Online (Sandbox Code Playgroud)

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

Nov*_*Joe 38

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

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

只需添加

.DataTokens.Add("area", "[your area name]");
Run Code Online (Sandbox Code Playgroud)

到默认路由定义的末尾.

  • 如果您有重复的控制器,只需添加命名空间属性.``namespaces:new [] {"Solution.MyProject.Areas.Admin.Controllers"}`` (7认同)

And*_*bel 9

我已经测试了区域注册的代码,它可以工作并选择正确的控制器.但是,即使使用了正确的控制器,视图分辨率也会在根文件夹中找到该视图.

为了测试,我在我的区域家庭控制器中使用了以下主页索引操作:

public ActionResult Index()
{
    return View(model: "Admin area home controller");
}
Run Code Online (Sandbox Code Playgroud)

然后我在/ Views/Home中的index.chstml:

Root View: @Model
Run Code Online (Sandbox Code Playgroud)

和/ Areas/Admin/Views/Home中的index.cshtml:

Admin Area view: @Model
Run Code Online (Sandbox Code Playgroud)

运行时,输出为:

Root View:管理区域主控制器

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

所以最后,视图选择确实是错误的,因此您的问题与如何在MVC中设置默认路由(到某个区域)相同.


Lev*_* K. 6

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

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

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

网站路线:

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

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

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");
Run Code Online (Sandbox Code Playgroud)