3

次のルートが定義されています

            routes.MapRoute(
            "ItemName",
            "{controller}/{action}/{projectName}/{name}",
            new { controller = "Home", action = "Index", name = "", projectName = "" }
            );

このルートは実際に機能するので、ブラウザに入力すると

/Milestone/Edit/Co-Driver/Feature complete

マイルストーン コントローラー、編集アクションに正しく移動し、値を渡します。

ただし、ビューでurl.actionを使用してリンクを作成しようとすると-

<%=Url.Action("Edit", "Milestone", new {name=m.name, projectName=m.Project.title})%>

次のURLを取得します

Milestone/Edit?name=Feature complete&projectName=Co-Driver

それはまだ機能しますが、あまりきれいではありません。何か案は?

4

3 に答える 3

5

ASP.NET ルーティング (ASP.NET MVC が使用するもの) でルートを構築して照合する場合、最も貪欲なものではなく、最初の適切な一致が使用され、順序が重要になります。

したがって、2 つのルートがある場合:

"{controller}/{action}/{id}"
"{controller}/{action}/{projectName}/{name}"

その順序で、最初のものが使用されます。追加の値 (この場合は projectName と name) がクエリ パラメータになります。

実際、{projectName} と {name} にデフォルト値を指定したため、デフォルト ルートと完全に競合しています。選択肢は次のとおりです。

  • デフォルト ルートを削除します。デフォルトルートがもう必要ない場合は、これを行ってください。

  • 最初に長いルートを移動し、次のようにデフォルト ルートと一致しないように明示的にします。

    routes.MapRoute(
        "ItemName",
        "Home/{action}/{projectName}/{name}",
        new { controller = "Home", action = "Index", name = "", projectName = "" }
    );
    

    このように、 controller == Home を持つルートは最初のルートと一致し、 controller != Home を持つルートは 2 番目のルートと一致します。

  • ActionLinks の代わりに RouteLinks を使用してください。具体的には、必要なルートに名前を付けて、あいまいさのない正しいリンクを作成します。

于 2008-11-27T19:52:24.247 に答える
1

片付けるために、@Bradからの回答のおかげで、これを解決するために最終的に行ったことを次に示します

<%=Html.RouteLink("Edit", "ItemName", new { projectName=m.Project.title, name=m.name, controller="Milestone", action="Edit"})%>
于 2008-11-28T10:18:27.947 に答える
0

あなたが試すことができます

Html.RouteLink("Edit","ItemName", new {name=m.name, projectName=m.Project.title});
于 2008-11-27T19:40:26.020 に答える