2

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

4 に答える 4

2

現時点でキャッチしすぎているカスタムルート

あなたの例外は、あなたのカスタムルートがあなたがそれが捕まえることを意図していなかった何かを捕らえていることをあなたに伝えるだけです。したがって、アプリケーションのルートURLへのリクエストがある場合は次のようになります。

http:// localhost / Website

あなたのカスタムルートはそれを捕まえるでしょう。そして、それをデフォルトに設定します。CaseController.Advance()そして、あなたの行動を呼びなさい。そしてもちろん、id定義されていないため、例外をスローします。

カスタムルートをデフォルトルートの前に保持します

ただし、カスタムルートを変更するか、ルート制約を追加して、実際にキャッチする予定のリクエストのみをキャッチするようにする必要があります。

しかし、どの変更を行う必要がありますか?それを必要とするコントローラーが1つしかない場合は、次のように変更します。

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が定義されているリクエストのみをキャッチします。もちろん数として。

どちらが自分に最も適しているかがわかります。

于 2010-02-06T22:51:59.600 に答える
2

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

于 2010-02-06T00:46:49.963 に答える
1

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

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

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

于 2010-02-06T01:40:05.660 に答える
1

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

actionlinkパラメーター名は、ルートパラメーター名と一致する必要があります。一致しない場合は、表示されている内容を正確に取得できます。

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

于 2010-02-06T00:58:20.833 に答える