【问题标题】:ASP.NET MVC Routing Root Level ViewsASP.NET MVC 路由根级视图
【发布时间】:2009-06-29 06:50:59
【问题描述】:

我以为这会很容易,但我完全感到困惑。

我希望一个控制器的视图位于应用程序的根级别,而不是位于该控制器的子目录中,但我无法弄清楚。

我想要这两个网址:

/Info - 这应该在控制器“Home”上操作“Info”

/Admin/ - 这应该是控制器“Admin”上的操作“Index”(默认)

到目前为止,无论我尝试了什么,第一条路线最终都会赶上两者。我似乎无法将两者分开。

那个信息页面甚至不需要控制器,它是静态的,但我确实想使用母版页。可能有更简单的方法来解决这个问题,但我也没有想到。

我能想到的唯一方法就是创建一个 Info 控制器,并将 Views/Home/Info 移动到 Views/Info/Index,但这有一定的味道。

我可以在 Rails 中使用:

  map.connect ':controller/:action/:id'
  map.connect ':action', :controller => 'home'

【问题讨论】:

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


    【解决方案1】:

    您只需要正确的路线。在你的情况下:

    routes.MapRoute(
                    "Info",
                    "Info",
                    new { controller = "Home", action = "Info" }
    
    routes.MapRoute(
                    "Admin",
                    "Admin",
                    new { controller = "Admin", action = "Index" }
    

    但我建议您使用this 方法。

    如果您需要更改视图/部分视图的默认物理位置,
    查看how to 创建自定义视图引擎。

    【讨论】:

    • 没想到静态路由它们,挂断了寻找模式的方法!似乎仍然应该有一个更动态的方式,所以我不必为每个页面添加新的路由。
    • 我也是这么想的,但我不再那么乐观了。无论如何-通过属性路由对我来说似乎是灵丹妙药。 :)
    • 几乎就像有一个隐含的斜杠,所以最后“/Info”和“/Admin/”最终会到达相同的路线,因为“​​/Info”被视为“/Info/”。反之亦然;如果我重新排序路线,第一条路线仍然会同时捕获。在这种情况下,它就像对待“/Admin/”一样对待“/Admin”。我正在检查基于属性的路由。绝对看起来很有希望。
    • 是的,但可能会变得相当复杂。恐怕我很快也得深入研究了。如果您设法找到任何有趣的东西,请在此处发布以回答您的进度。将其标记为收藏。 :)
    • 在第一个示例中,这将为/Info 提供一个工作路径,但它仍然可以在/Home/Info 上调用。我们可以清除该路由或将其重定向为仅使用/Info吗?
    【解决方案2】:

    您可以使用路由属性。

    在你的路由配置文件中你应该有。

            routes.MapMvcAttributeRoutes();
            AreaRegistration.RegisterAllAreas();
            //code below should already be in your route config by default
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
    

    那么在每个动作之上你都可以有一个路由属性。

     [Route("info")]
    

    您甚至可以通过添加参数和/或子文件夹来更高级地使用这些属性

     [Route("blog/posts/{postId}")]
    

    您可以将上述属性放在任何操作上,它看起来好像来自博客控制器。但是,您甚至不需要博客控制器。 {} 也表示参数,因此只需确保您的操作采用与花括号中的参数相同的参数。在这种情况下,参数将是

    string postId
    

    【讨论】:

      猜你喜欢
      • 2014-02-14
      • 2013-03-12
      • 2021-12-18
      • 2011-03-14
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多