30

我创建了具有 3 个不同区域的 MVC 应用程序。(管理员、用户、新闻)这是我在 App_Start 目录中的 RouteConfig.cs 文件:

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

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

这是我的 AdminAreaRegisteration.cs 文件:

    namespace TestMvcApplication.Areas.Admin
{
    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 { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "TestMvcApplication.Areas.Admin.Controllers" }                
            );
        }
    }
}

最后这是我的 Global.asax.cs 文件内容:

namespace TestMvcApplication
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }
    }
}

我网站的主页已完全加载并且可以正常工作。但是路由未检测到管理员或其他区域的主页,我给出了以下错误消息:

Server Error in '/' Application.
The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly.

Requested URL: /Admin/Home

我怎么解决这个问题?谢谢。

4

3 回答 3

29

AreaRegistration.RegisterAllAreas()在你的某个地方打电话RegisterRoutes

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

提示:使用RouteDebugger 2.0Routing Debugger之类的工具来调查您的路线

获取最新的 NuGet: 用于 MVC 的 Route Debugger用于 WepApi 的 RouteDebugger

这是关于如何使用 WebApi 设置和使用 RouteDebugger 的教程

于 2012-11-19T13:44:34.623 回答
22

从提供的代码中,我可以看到 2 个潜在问题:

  1. 你没有打电话给RegisterAllAreas
  2. 您似乎没有覆盖AreaName属性

尝试将您的代码更改为:

全球.asax

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    AreaRegistration.RegisterAllAreas();
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "TestMvcApplication.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 { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
于 2012-11-19T13:53:06.110 回答
5

只需使用静态方法RegisterAreas()在这里代码创建一个静态类名称它AreaConfig :

public static class AreaConfig
{
    public static void RegisterAreas()
    {
        // 
        // Admin area . . .

        var adminArea = new AdminAreaRegistration();
        var adminAreaContext = new AreaRegistrationContext(adminArea.AreaName, RouteTable.Routes);
        adminArea.RegisterArea(adminAreaContext);


        // 
        // Default area . . .

        var defaultArea = new DefaultAreaRegistration();
        var defaultAreaContext = new AreaRegistrationContext(defaultArea.AreaName, RouteTable.Routes);
        defaultArea.RegisterArea(defaultAreaContext);
    }
}

然后在 Global.asax.cs 文件中调用它,如下所示:

protected void Application_Start()
    {
        . . .

        AreaConfig.RegisterAreas();

        . . .
    }
于 2013-05-23T23:21:53.700 回答