我跟着ASP:NET MVC 4中有关区域的文章(如何避免名称冲突)。我使用的是MVC 5,但我认为版本4中的所有功能都可用,并且应该可以在版本5中使用。
我的目录结构:
文件EpicAreaRegistration.cs内容:
namespace App1.Web.UI.Areas.Epic
{
public class EpicAreaRegistration : AreaRegistration
{
public override string AreaName
{
get{ return "Epic"; }
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRouteLocalized(
name: "Epic_default",
url: "Epic/{controller}/{action}/{id}",
defaults: new { controller = "Pm", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "App1.Web.UI.Areas.Epic.Controllers" }
);
}
}
}
我的项目的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 = "Default", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "App1.Web.UI.Controllers" } // according to article namespace must be added here, so ASP.NET router distinguishes between request: e
);
}
}
最后我在项目目录Controllers中有EpicController.cs文件:
namespace App1.Web.UI.Controllers
{
public class EpicController : Controller
{
public ActionResult Browse()
{
return View();
}
}
}
当我导航到:http://localhost:7300/Epic/Pm时,它可以正常工作(找到它),但http://localhost:7300/Epic/Browse无法正常工作(404 - 未找到)。我错过了什么?
我的假设是请求通过某种路由表。如果它没有在区域中找到Epic / Browse,它应该移动到项目的根Controller文件夹。它与视图(文件夹,如果不在共享中的文件夹外观,文件夹)相同的类比......
此外,我在Application_Start
中注册了所有区域public class Global : HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
....
答案 0 :(得分:1)
确保您的Area
控制器使用正确的命名空间。
EpicController的命名空间目前是:
namespace App1.Web.UI.Controllers
将其更改为:
namespace App1.Web.UI.Areas.Epic.Controllers
答案 1 :(得分:0)
你的控制器也是史诗。所以你的网址看起来像
答案 2 :(得分:0)
这可以帮助您访问,
http://localhost:7300/Areas/Epic/Epic/Browse
因为它包含在子文件夹中。