ASP.NET MVC领域:如何在URL中隐藏“区域”名称?

时间:2010-04-21 10:43:44

标签: asp.net-mvc-routing asp.net-mvc-areas

运行具有博客区域和博客控制器的MVC 2 Areas example时,网址如下所示:

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

RootUrl / AreaName / ControllerName / ActionName

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

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

修改

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

2 个答案:

答案 0 :(得分:19)

在每个区域的文件夹中,您会看到*AreaName*AreaRegistration.cs文件。这是存储区域路由规则的地方。默认情况下,在生成它们时,它们将包含区域名称,而不是其他所有内容。问题是:如果从路径中删除区域名称“folder”,则路径将捕获所有“标准”{controller} / {动作} / {id}请求。这显然不是你想要的......

要解决此问题,您可以根据路由中存在的控制器名称在路由上添加正则表达式过滤器。缺点?您将无法在应用程序中拥有两个具有相同名称的控制器(至少不使用标准路由..您始终可以考虑使用不同的路径来访问它们:))

最后......有这样的结构:

  

/地区
  /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: 根据您的问题更新: 如果你要使用区域,我们必须考虑一件大事:如果你有区域间链接,你还必须在链接中提供区域名称。 E.g。

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

你明白了。

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

  

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

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

答案 1 :(得分:1)

只是回答你原来的问题,以防其他人正在阅读:

不要为[默认]控制器博客命名。这就是你获得博客/博客{area / controller}的原因。您可以给它一个完全不同的名称:即博客/视图,博客/帖子,博客/近期等,或者像家一样的默认值。在这种情况下,如果你的区域外控制器中也有家,你需要命名你的默认控制器:

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

这将确保“/”和“/ blog”转到相应的“home”控制器。如果您搜索重复的家庭控制器错误,您将在此处找到更多信息。

相关问题