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

Mic*_*son 4 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 }
        );
    }
Run Code Online (Sandbox Code Playgroud)

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

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

有任何想法吗?

mes*_*sut 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"}
        );
Run Code Online (Sandbox Code Playgroud)

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


dan*_*wig 1

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

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

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

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

base/ControllerAName/Action1Name
base/ControllerAName/Action2Name
base/ControllerBName/Action6Name
Run Code Online (Sandbox Code Playgroud)

...等等。这是开箱即用的 MVC 的“约定”。仔细观察,您会发现此模式与全局 asax 中的基本路由定义相匹配:

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

另一方面,当您使用区域时,您的“常规”URL 架构将如下所示:

base/AreaName/ControllerAName/Action1Name
base/AreaName/ControllerAName/Action2Name
base/AreaName/ControllerBName/Action6Name
Run Code Online (Sandbox Code Playgroud)

注意到区别了吗?这就是为什么区域注册中的默认路由定义如下所示:“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 }
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

我建议您尝试开始一个新项目,或创建一个新区域,并尝试这些建议。掌握来自 Web 表单的路由可能很棘手,但一旦掌握了它,我想您会发现它优于 Web 表单中的 URL-TO-FILE 映射。