我有个问题.我在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 /访问,但我只是得到"无法找到资源".
有任何想法吗?
检查控制器的命名空间; 就我而言; 默认路线是:
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",应用程序正常工作.
通常,当您创建区域时,您将获得与 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 映射。