将参数传递给控制器​​的动作跳过动作名称

时间:2012-02-11 16:39:47

标签: asp.net-mvc-3 routing controller action asp.net-mvc-routing

我正在寻找缩短从DB获取一些URL的方法。我有Homecontroller和writing动作,它向DB添加行,每个行都有UID。还有search动作,它可以在DB中找到记录并呈现视图。

所以我使用localhost/Home/writing添加记录,localhost/Home/search/3456按UID搜索记录。

有没有办法将UID(3456)传递给控制器​​的动作跳过动作的名称,所以要搜索一个resord我可以使用localhost/Home/3456甚至localhost/3456

我试过

routes.MapRoute(
    "default-action", 
    "{controller}/{id}", 
    new { action = "search", id = UrlParameter.Optional }
);

routes.MapRoute(
    "default-action", 
    "{id}", 
    new {controller = "Home", action = "search", id = UrlParameter.Optional }
);

但一无所获。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用路线约束:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Search",
        "{id}",
        new { controller = "Home", action = "Search" },
        new { id = @"\d+" }
    );

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

现在:

  • localhost/Home/writing会点击Writing
  • 上的HomeController操作
  • localhost/3456将点击Search上的HomeController操作并将其id=3456作为参数传递

我们为{id}路由令牌定义的数字约束是必需的,以便路由引擎消除搜索和默认路由模式之间的歧义(因为动作名称不能以数字开头)。它假定您的标识符是数字。