如果找到动作名称然后调用动作,如果没有在MVC路由中调用默认动作

时间:2012-09-13 20:16:24

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

这是我目前的路线

routes.MapRoute(
            "Default",                                              // Route name
            "{action}/{id}",                                        // URL with parameters
            new { controller = "MarketingSite", action = "index", id = "" }  // Parameter defaults
        );

所以,每当我访问domain.com/test

这将调用名为MarketingSite的控制器中的测试操作。

我想要实现的是当我访问domain.com/load-from-db并且由于我没有一个名为load-from-db的操作,我想将请求指向特定的操作并加载 - from-db成为该操作的参数。在该操作中,我将基于参数从数据库中读取内容,然后返回视图。如果我指定一个存在的动作,那么它只会调用该动作。

任何帮助?

2 个答案:

答案 0 :(得分:1)

首先注意 - 路由引擎将按您列出的顺序应用路由,检查每个路由,如果不匹配则继续。您当前将“默认”路由设置为全能 - 如果找不到它使用“MarketingSite”的控制器,如果没有它使用“index”的操作。如果我理解您的问题,您根本不想要“索引”操作,您想要调用另一个操作,并将查询传递给它。

你可以尝试:

//Look for a matching action        
routes.MapRoute(
                    "MatchAction", // Route name
                    "{action}/{id}",
                     new { controller = "MarketingSite", id = UrlParameter.Optional}                                    
                );

//With a single segment, pass that to a specific action as a parameter.
routes.MapRoute(
                    "load-from-db",  // Route name
                    "{load-from-db}", // URL with parameters
                    new { controller = "MarketingSite", action = "MyAction"}
                );

//With no segments (ex. domain.com/) use the Index on MarketingSite as default.
routes.MapRoute(
                    "Default", // Route name
                    "", // URL with parameters
                    new { controller = "MarketingSite", action = "Index"}
                );

然而,这些路线可能无法完全满足您的要求 - 在MVC中映射您的路线可能有点棘手。您应该检查此this,并相应地设计您的路线。

希望有所帮助, 克里斯

答案 1 :(得分:0)

覆盖HandleUnknownAction控制器上的MarketingSite方法:

protected override void HandleUnknownAction(string actionName) {
   // TODO: check for actionName in database
}