3

特定の「テーマ」でタグ付けされたパズルのリストがあります。特定のカテゴリでタグ付けされたスタックオーバーフローで質問を考えてください。

次のように機能するように、ルート設定を取得しようとしています。

http://www.wikipediamaze.com/puzzles/themed/Movies 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

この問題に加えて、コントローラー アクションの "Themes" パラメーターは常に null になります。クエリ文字列パラメーターをコントローラー アクション パラメーターに変換することはありません。ただし、手動で移動すると

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

すべてがうまく機能します。私は何が欠けていますか?

前もって感謝します!

4

3 に答える 3

1

への呼び出しのactionNameパラメーター (2 番目のパラメーター) が、ルート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 がデフォルト ディクショナリ内に実際の URL 内のパラメータではないパラメータを検出すると、2 つのルートを区別するためにその値を指定する必要があります。

この場合、ルートを区別するアクションを指定する必要があります。

于 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 に答える