我有问题。我在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 /访问,但我只是得到“无法找到资源”。
有什么想法吗?
答案 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()
,之前任何区域都存在。但现在我添加了一个区域,这就是删除了所有路线。