区域无法加载MVC - 无法找到资源

时间:2011-12-17 21:31:59

标签: asp.net-mvc-3

我有问题。我在MVC 3中有一个名为Page的区域可以正常工作。

我刚刚添加了一个名为Media的新区域,现在我得到了“无法找到该资源”的新区域。我疯了,因为它看起来与PageArea完全相同。

以下是MediaAreaRegistration.cs

public override string AreaName
    {
        get
        {
            return "Media";
        }
    }

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

这是我的global.asax

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

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

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );


    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

我试图通过localhost / media /访问,但我只是得到“无法找到资源”。

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

检查控制器的命名空间; 就我而言;默认路线是:

context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            defaults: new {controller = "Home", action = "Index", AreaName="Admin", id = UrlParameter.Optional },
            namespaces: new[] { "MyApp.Admin.Controllers"}
        );

但是当我创建控制器时,MVC会自动设置" MyApp.WebUI.Areas.Admin.Controllers"作为新Controller的命名空间;我将名称空间更改为我在默认路由中定义的名称" MyApp.Admin.Controllers"和申请工作正常。

答案 1 :(得分:1)

通常,在创建区域时,您将获得与global.asax中的默认路径略有不同的默认路由。例如,我在MVC3项目中创建了一个Media区域,默认路由如下所示:

context.MapRoute(
    "Media_default",
    "Media/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional }
);

区域中的路由与全局asax中定义的路由没有什么不同,只是它们在不同的命名空间中查找控制器。此外,它们在global.asax中的路由之前加载。您可以看到这一点,因为在Application_Start中,在RegisterRoutes之前调用RegisterAllAreas。

通常,这是根控制器的URL架构,其路由在global.asax中定义:

base/ControllerAName/Action1Name
base/ControllerAName/Action2Name
base/ControllerBName/Action6Name

......等等。这是MVC开箱即用的“惯例”。仔细观察,您将看到此模式与全局asax中的基本路由定义匹配:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", 
        id = UrlParameter.Optional } // Parameter defaults
);

另一方面,使用区域时的惯例是“常规”URL架构如下所示:

base/AreaName/ControllerAName/Action1Name
base/AreaName/ControllerAName/Action2Name
base/AreaName/ControllerBName/Action6Name

注意区别?这就是区域注册中的默认路由定义如下所示的原因:“Media / {controller} / {action} / {id}”

所有这些都说明了,没有什么可以阻止你偏离惯例。听起来你想要一个名为Media的区域,以及一个URL基础/媒体,它可以转到该区域某个控制器上的某个动作方法。如果这是正确的,请尝试这样做 - 记住将更具体的路由放在MVC生成的默认路由之前:

context.MapRoute(null,
    "media",
    new { action = "Index", controller = "Media" }
);

context.MapRoute(
    "Media_default",
    "Media/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional }
);

这意味着MVC会将基础/媒体与媒体区域MediaController上的Index操作方法匹配,因为首先定义了该路由。

此外,当您创建新区域时,不会更改任何名称空间。这只会给你带来麻烦。

另一个提示是不给路线指定路线名称。请注意我如何将null作为第一个参数传递。这被认为是一种很好的做法 - 按名称访问路线可能会非常混乱。

我建议您尝试启动新项目,或创建新区域,然后尝试这些建议。抓取来自webforms的路线可能很棘手,但是一旦掌握了它,我认为你会发现它优于webforms中的URL-TO-FILE映射。

答案 2 :(得分:0)

在我的情况下,有人在RouteConfig.cs中添加routes.Clear(),之前任何区域都存在。但现在我添加了一个区域,这就是删除了所有路线。