代码之家  ›  专栏  ›  技术社区  ›  Mark Redman

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

  •  14
  • Mark Redman  · 技术社区  · 16 年前

    当运行 MVC 2 Areas example 具有博客区域和博客控制器的URL如下所示:

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

    根URL/区域名/控制器名/操作名

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

    不完全清楚路由,如何设置路由以不显示区域名?

    编辑:

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

    2 回复  |  直到 14 年前
        1
  •  19
  •   xanadont    14 年前

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

    为了克服这个问题,您可以根据路由中存在的控制器名称,在路由上添加regex过滤器。缺点?您将无法在应用程序中拥有两个同名的控制器(至少不使用标准路由)。您总是可以想到一个不同的路径来访问它们:)

    最后。。具有这种结构:

    /地区
    /区域/blog/controllers/blogcontroller.cs
    /区域/博客/控制器/feedcontroller.cs
    /区域/用户/控制器/用户控制器.cs
    /控制器/页面控制器.cs

    你应该拥有这样的东西: 在blogarearregistration.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///helper,未移动到库的扩展类
    /模型/数据///这里是EF类+验证类
    /模型/视图模型/控制器//查看每个控制器存储的模型

    到目前为止,它工作得很好,我设法使解决方案保持相对有序。如我所说,目前我创建的唯一区域是 Admin 因为它是 那个 与其他网站有很大不同:)

        2
  •  1
  •   Tony Basallo    16 年前

    只是为了回答你最初的问题,以防有人阅读:

    不要命名你的[默认]控制器博客。这就是为什么你会得到博客/博客区域/控制器。您可以给它取一个完全不同的名字:例如,blog/view、blog/posts、blog/recent等等,或者是默认的home。在这种情况下,如果您的外围控制器中也有主控制器,则需要为默认控制器命名:

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

    这将确保“/”和“/blog”转到相应的“home”控制器。如果你搜索重复的家庭控制器错误,你会发现更多关于这个。

    推荐文章