3

我有一个标有特定“主题”的谜题列表。思考关于 stackoverflow 标记为某些类别的问题。

我正在尝试设置我的路线,以便它像这样工作:

http://www.wikipediamaze.com/puzzles/themed/ 电影 http://www.wikipediamaze.com/puzzles/themed/Movies,Another-Theme,And-Yet-Another-One

我的路线设置如下:

    routes.MapRoute(
        "wiki",
        "wiki/{topic}",
        new {controller = "game", action = "continue", topic = ""}
        );

    routes.MapRoute(
        "UserDisplay",
        "{controller}/{id}/{userName}",
        new {controller = "users", action = "display", userName=""},
        new { id = @"\d+" }
        );

    routes.MapRoute(
        "ThemedPuzzles",
        "puzzles/themed/{themes}",
        new { controller = "puzzles", action = "ThemedPuzzles", themes = "" }
        );

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

我的控制器看起来像这样:

public ActionResult ThemedPuzzles(string themes, PuzzleSortType? sortType, int? page, int? pageSize)
{
    //Logic goes here
}

我在视图中的操作链接调用如下所示:

        <ul>
        <%foreach (var theme in Model.Themes)
          { %>
            <li><%=Html.ActionLink(theme, "themed", new {controller = "puzzles", themes = theme})%></li>
            <% } %>
        </ul>

但是我遇到的问题是:

生成的链接如下所示:

http://www.wikipediamaze.com/puzzles/themed?themes=MyThemeNameHere

要添加到此问题,控制器操作上的“主题”参数始终为空。它从不将查询字符串参数转换为控制器操作参数。但是,如果我手动导航到

http://www.wikipediamaze.com/puzzles/themed/MyThemeNameHere http://www.wikipediamaze.com/puzzles/themed/MyThemeNameHere,Another-ThemeName

一切正常。我错过了什么?

提前致谢!

4

3 回答 3

1

您调用的actionName参数(第二个参数)与您在路由Html.ActionLink中指定的操作不匹配。"ThemedPuzzles"

与菲尔的建议非常相似,请尝试:

<%= Html.ActionLink(theme, "ThemedPuzzles", new { controller = "puzzles", themes = theme }) %>

或者您可以直接调用路由(因为它已命名),而无需指定控制器或操作(因为它们将从路由默认值中获取):

<%= Html.RouteLink(theme, "ThemedPuzzles", new { themes = theme }) %>
于 2009-08-18T23:16:49.573 回答
0

试试这个:

<li><%=Html.ActionLink(theme, "themed", new {controller = "puzzles", **action="ThemedPuzzles"** themes = theme})%></li>

您需要指定操作,因为您有默认操作,但您的 URL 中没有 {action} 参数。这种行为的原因是假设有另一条路线,如

routes.MapRoute(
        "SpecialThemedPuzzles",
        "puzzles/special-themed/{themes}",
        new { controller = "puzzles", action = "SpecialThemedPuzzles", themes = "" }
        );

您将如何生成此路由的 URL?除非我们有办法将这条路线与您的其他主题路线区分开来,否则您将无法做到。因此,在这种情况下,当 Routing 在 defaults 字典中看到一个不是实际 URL 中的参数的参数时,它要求您指定该值以区分这两个路由。

在这种情况下,它需要您指定操作以区分路由。

于 2009-08-18T17:15:31.970 回答
0

在您的路由声明中,尝试在您的控制器方法中指定每个输入参数。

routes.MapRoute(        
"ThemedPuzzles",        
"puzzles/themed/{themes}",        
new { controller = "puzzles", action = "ThemedPuzzles", themes = "",  sortType = "", page="", pageSize="" }        
);

如果您有排序类型、页码和页面大小的默认值,您甚至可以在此处设置它们,因此如果它们不包括在内,则传入默认值。

于 2009-08-20T14:09:17.033 回答