2


1

ASP.NET MVC ActionLink:生成された奇妙なURL

次の `Html.ActionLink`が呼び出される理由:

Html.ActionLink("Approve", "Advance", new { id = Model.ID, step = StepType.Approve })

「残りの」URLではなく、クエリパラメータを使用してURLを生成します。

http://localhost/Website/Case/Advance/1?step=Refer

デフォルトルートのみを登録していますが、「StepType」パラメーターを理解できる追加のルートが必要ですか?

このルートをデフォルトルートの「後」に追加しようとしました。

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new {controller = "Case", action = "Advance", id = "", step = StepType.Refer});

しかし効果はありませんでした。 デフォルトの前に新しいルート登録を追加すると、エラーが発生しました:

_ パラメーターディクショナリには、 'Website.Controllers.CaseController’のメソッド 'System.Web.Mvc.ActionResult Advance(Int64、Website.Core.StepType)'のnullを許可しない型 'System.Int64’のパラメーター 'id’のnullエントリが含まれています'。 パラメータをオプションにするには、その型を参照型またはNullable型にする必要があります。 _

4 Answer


2


はい、「\ {controller} / \ {action} / \ {id} / \ {step}」などのルートがない場合、ActionLinkメソッドは単に「step」をクエリ文字列パラメーターとして渡します。


2


現時点ではカスタムルートが多すぎます

例外は、カスタムルートがキャッチするつもりのないものをキャッチしていることを示しているだけです。 したがって、アプリケーションのルートURLへのリクエストがある場合:

http:// localhost / Website

カスタムルートがキャッチします。 そして、それをデフォルトに設定します。 そして、 `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が定義されているリクエストのみをキャッチします。 もちろん多数。

どれがあなたに一番合っているかがわかります。


1


ルートでstepTypeのパラメーターを指定しましたが、stepというパラメーターを渡しました。

アクションリンクのパラメーター名は、ルートのパラメーター名と一致する必要があります。一致しない場合は、正確に表示されます。

編集:わかりました、この答えを入力している間にコードを変更しました!!


1


RouteLinkを使用してみて、それが機能するかどうかを確認してください。

Html.RouteLink("Approve", "CaseAdvance", new { controller = "Case", action = "Advance", id = Model.ID, step = StepType.Approve })

RouteLinkを呼び出して有効なリンクが生成される場合、少なくともルートが正しく設定されていることを意味します。