Mar*_*man 15 asp.net-mvc-routing asp.net-mvc-areas
运行具有博客区域和博客控制器的MVC 2区域示例时,URL如下所示:
http:// localhost:50526/Blog/Blog/ShowRecent格式:
RootUrl/AreaName/ControllerName/ActionName
刚刚发现了MVC区域,它似乎是一种组织代码的好方法,即为每个部分创建一个区域,在我的例子中每个区域都有自己的控制器.这意味着每个AreaName = ControllerName.这样做的结果是Url中的双AreaName/ControllerName路径,例如/ Blog/Blog /上面
没有完全清楚地了解路由,我如何设置路由以不显示AreaName?
编辑:
我试图减少路由的工作量,因为这些似乎相互影响(即需要特定的排序)并可能导致严重的头痛:-)在将现有的webform应用程序转换为MVC时,我已经转换了几个核心部分,它们各有一个Controller和相当数量的View/Actions,虽然大部分数据访问都是在程序集中,但Model/ViewData类的数量正在增长......我目前正在根模型/视图中创建子文件夹这些部分(或区域)的文件夹,并希望创建区域将以相同的方式工作,除了组织代码(使用覆盖区域的基本路线)任何评论?
Art*_*aru 20
在每个区域的文件夹中,您将看到一个*AreaName*AreaRegistration.cs文件.这是存储区域路由规则的地方.默认情况下,在生成它们时,它们将包含区域名称,而不是其他所有内容.问题是:如果从路径中删除区域名称"folder",则路径将捕获所有"标准"{controller}/{动作}/{id}请求.这显然不是你想要的......
要解决此问题,您可以根据路由中存在的控制器名称在路由上添加正则表达式过滤器.缺点?您将无法在应用程序中拥有两个具有相同名称的控制器(至少不使用标准路径..您始终可以考虑使用不同的路径来访问它们:))
最后..有这个结构:
/
areas
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs /Controllers/PageController.cs
你应该拥有的是这样的:在BlogAreaRegistration.cs中:
context.MapRoute(
"Blog_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { controller = "(Blog|Feed)" }
);
Run Code Online (Sandbox Code Playgroud)
在UserAreaRegistration.cs中:
context.MapRoute(
"User_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { controller = "(User)" }
);
Run Code Online (Sandbox Code Playgroud)
在Global.asax.cs中:
public static void RegisterRoutes(RouteCollection routes)
{
context.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)
请注意,在global.asax区域注册首先!:)
UPD: 基于您的问题更新:如果您要使用区域,我们必须考虑一件大事:如果您有区域间链接,您还必须在链接中提供区域名称.例如
<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %>
Run Code Online (Sandbox Code Playgroud)
你明白了.
关于多个模型/视图,目前我正在遵循这样的结构
/ code/// helper,未移动到libraries
/Models/Data///的扩展类EF类+验证类在这里
/Models/ViewModels/{controller}///每个控制器存储的视图模型
到目前为止它工作正常,我设法使解决方案相对有条理.正如我所说,我创建至今的唯一区域是Admin区域,因为它是很多从网站的其他部分不同的:)