ASP.NET MVC ActionLink:Strange URLが生成しました
-
18-09-2019 - |
質問
なぜ次のものがありますか Html.ActionLink
電話:
Html.ActionLink("Approve", "Advance", new { id = Model.ID, step = StepType.Approve })
「安らかな」URLではなく、クエリパラメーターを使用してURLを生成します。
http://localhost/Website/Case/Advance/1?step=Refer
デフォルトのルートのみが登録されていますが、「ステップタイプ」パラメーターが何であるかを理解できる追加のルートが必要ですか?
このルートを追加してみました 後 デフォルトルート:
routes.MapRoute(
"CaseAdvance",
"{controller}/{action}/{id}/{step}",
new {controller = "Case", action = "Advance", id = "", step = StepType.Refer});
しかし、それは効果がありませんでした。新しいルート登録を追加します 前 デフォルトでエラーが発生しました。
パラメーター辞書には、非nullableタイプのパラメーター 'id' 'system.int64'のnullエントリが含まれています。 '。パラメーターをオプションにするには、そのタイプを参照タイプまたは無視可能なタイプのいずれかにする必要があります。
解決
現時点でキャッチしすぎているカスタムルート
あなたの例外は、あなたのカスタムルートがあなたがそれをキャッチするつもりのないものをキャッチしていることをあなたに伝えるだけです。したがって、アプリケーションルートURLにリクエストがある場合:
あなたのカスタムルートはそれをキャッチします。デフォルトを設定します。そしてあなたに電話してください CaseController.Advance()
アクション。そしてもちろん、例外を投げます id
定義されていません。
デフォルトのルートの前にカスタムルートを保持します
ただし、カスタムルートを変更するか、ルートの制約を追加する必要があります。これにより、実際にキャッチすることを意図したリクエストのみをキャッチする必要があります。
しかし、あなたはどの変更をすべきですか?それを変更するよりも、それを必要とする単一のコントローラーのみが存在する場合:
routes.MapRoute(
"CaseAdvance",
"Case/{action}/{id}/{step}",
new { controller = "Case", action = "Advance", id = "", step = StepType.Refer});
他のコントローラーがある場合は、そのまま保持することができます。制約を追加するだけです。
routes.MapRoute(
"CaseAdvance",
"{controller}/{action}/{id}/{step}",
new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
new { controller = "Case|Other" });
コントローラーがある場合は、IDを数値にする必要性を作成できます。
routes.MapRoute(
"CaseAdvance",
"{controller}/{action}/{id}/{step}",
new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
new { id = @"\d+" })
この場合、このルートは、実際にIDが定義されているリクエストのみをキャッチします。もちろん、多くのように。
どちらがあなたに最も合っているかを知っているでしょう。
他のヒント
はい、「{controller}/{action}/{id}/{step}」などのルートがない場合、ActionLinkメソッドは「ステップ」をクエリストリングパラメーターとして渡すだけです。
ルートでは、ステップタイプのパラメーターを指定しましたが、ステップと呼ばれるパラメーターを渡すことができます。
ActionLinkパラメーター名は、ルートパラメーター名と一致する必要があります。そうしないと、正確に見ているものが得られます。
編集:OK、この答えを入力している間にコードを変更しました!!
使用してみてください routelink そして、それがあなたのために働くかどうかを確認してください。
Html.RouteLink("Approve", "CaseAdvance", new { controller = "Case", action = "Advance", id = Model.ID, step = StepType.Approve })
Routelinkを呼び出すと有効なリンクが生成されると、少なくともルートが正しくセットアップされることがわかります。