【问题标题】:If action name found then call action, if not call a default action in MVC Routing如果找到动作名称,则调用动作,如果没有调用 MVC 路由中的默认动作
【发布时间】:2012-09-13 20:16:23
【问题描述】:

这是我目前的路线

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 成为该操作的参数。在该操作中,我将根据参数从数据库中读取一些内容,然后返回一个视图。如果我指定一个存在的动作,那么它只会调用那个动作。

有什么帮助吗?

【问题讨论】:

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


    【解决方案1】:

    第一个注意事项 - 路由引擎将按照您列出的顺序应用路由,检查每个路由,如果无法匹配则继续。您当前将“默认”路由设置作为包罗万象的 - 如果找不到控制器,则使用“MarketingSite”,如果没有操作,则使用“索引”。如果我理解您的问题,您根本不需要“索引”操作,您想调用另一个操作,并将查询传递给该操作。

    你可以试试:

    //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,并相应地设计你的路线。

    希望对您有所帮助, 克里斯

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-27
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 2011-06-02
        相关资源
        最近更新 更多