15

运行具有博客区域和博客控制器的MVC 2 区域示例时,URL 如下所示:

http://localhost:50526/Blog/Blog/ShowRecent格式:

RootUrl / AreaName / ControllerName / ActionName

刚刚发现 MVC 区域,这似乎是一种组织代码的好方法,即为每个部分创建一个区域,在我的例子中,每个部分都有自己的控制器。这意味着每个 AreaName = ControllerName。这样的效果就是Url中的双AreaName/ControllerName路径如上面的/Blog/Blog/

对路由没有完全清楚的了解,如何设置路由以不显示 AreaName?

编辑:

我正在尝试减少路由的工作量,因为它们似乎会相互影响(即需要特定的排序)并且可能会引起严重的头痛 :-) 在将现有的 webform 应用程序转换为 MVC 时,我已经转换了几个核心部分,它们每个都有一个控制器和相当数量的视图/操作,尽管大多数数据访问是代码在程序集中,但模型/视图数据类的数量正在增长......我目前正在根模型/视图中创建子文件夹这些部分(或区域)的文件夹,并希望创建区域能够以相同的方式工作,除了组织代码(使用覆盖区域的基本路线)对此有何评论?

4

2 回答 2

21

在每个区域的文件夹中,您会看到一个*AreaName*AreaRegistration.cs文件。这是存储区域路由规则的地方。默认情况下,当它们生成时,它们将在其他所有内容之前包含区域名称。问题是:如果您从路由中删除区域名称“文件夹”,该路由将捕获所有“标准”{controller}/{ action}/{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)" }
);

在 UserAreaRegistration.cs 中:

context.MapRoute(
    "User_default",
    "{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new { controller = "(User)" }
);

在 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);
}

请注意,在 global.asax 地区注册是第一位的!:)

UPD: 根据您的问题更新:如果您将使用区域,您必须考虑一件事:如果您有区域间链接,您还必须在链接中提供区域名称. 例如

<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %>

你明白了。

关于多个模型/视图,目前我正在遵循这样的结构

/Code/ // 助手,未移动到库的扩展类
/Models/Data/ // EF 类 + 验证类在这里
/Models/ViewModels/{controller}/ // 查看每个控制器存储的模型

到目前为止,它运行良好,并且我设法使解决方案保持相对有条理。正如我所说,到目前为止我创建的唯一区域是该Admin区域,因为它与网站的其他部分很大不同:)

于 2010-04-21T11:01:39.300 回答
1

只是为了回答您的原始问题,以防其他人正在阅读此内容:

不要命名您的 [default] 控制器博客。这就是为什么你会得到 blog/blog {area/controller}。您可以给它一个完全不同的名称:即 blog/view、blog/posts、blog/recent 等,或者像 home 这样的默认名称。在这种情况下,如果您在区域外控制器中也有 home,您将需要命名您的默认控制器:

routes.MapRoute("Default",
  "{controller}/{action}/{id}",
  new { controller = "Home", action = "Index", id = UrlParameter.Optional},
  new[] { *appname*.Controllers" });

这将确保 "/" 和 "/blog" 转到适当的 "home" 控制器。如果您搜索重复的家庭控制器错误,您会发现更多信息。

于 2010-05-11T18:12:23.057 回答