【问题标题】:passing parameters into controller's action skipping action name将参数传递给控制器​​的动作跳过动作名称
【发布时间】:2012-03-03 18:10:25
【问题描述】:

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

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

有没有办法将 UID (3456) 传递给控制器​​的动作跳过动作的名称,所以要搜索资源,我可以使用 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 }
);

但一无所获。

【问题讨论】:

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


    【解决方案1】:

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

    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 将在 HomeController 上点击 Writing 操作
    • localhost/3456 将在 HomeController 上点击 Search 操作并将其传递给 id=3456 作为参数

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

    【讨论】:

    • @versus,如果这篇文章帮助你解决了你遇到的问题,请点击它旁边的勾号,确保mark it as answer
    • 完成!对不起,我是这里的新手,不能给你的答案“有用点”:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多