1

カスタムルートを追加しました:

RouteTable.Routes.Insert(
    0,
    new Route(
        "common/scripts",
        new EmbeddedScriptRouteHandler()
    )
);

これで、BeginForm を使用してビュー内の Form タグをレンダリングするたびに、BeginForm によって生成される URL が変更されました。したがって、たとえば、このカスタム ルートがない@Html.BeginForm("Index", "Home")と、 action を含む Form タグが生成されます"/Home/Index"。この新しいルートを追加するとすぐに、フォーム タグ アクションが になり"/common/scripts?action=Index&controller=Home"ます。なぜこれが変わったのですか?

私の望む結果は、すべての URL"/common/scripts"がカスタム ルートによって処理されることですが、他のすべての URL はデフォルト ルートによって処理されます。

4

1 に答える 1

0

そのルートが最初のルートとして含まれているため、変更されました。そのため、MVC が URL を生成しようとすると、常にその URL が見つかります。セグメントやデフォルト値がないため、ルートは常に一致し、コントローラー/アクションなどのパラメーターはクエリ文字列値として含まれます。

ルート定義にセグメントを追加できscriptNameます (ルート ハンドラで使用されない場合でも)。そうすれば、 の値を渡さない限り、Url を生成するときにこのルートは選択されませんscriptName

RouteTable.Routes.Insert(0,
    new Route(
        "common/scripts/{scriptName}",
        new EmbeddedScriptRouteHandler()
    )
);

別のオプションは、コントローラーのデフォルト値を設定することです。これは、どのコントローラーにも一致しません。このように MVC で URL を生成する場合、その値に一致するコントローラーがないため、このルートは常に除外されます。カスタムルートハンドラーを使用するため、着信ルートを解決するときにこれが他の影響を与えることはありません。

このようなもの:

RouteTable.Routes.Insert(0,
    new Route(
        "common/scripts",    
        new RouteValueDictionary(new { controller = "AControllerThatDoesntExists"}),
        new EmbeddedScriptRouteHandler()
    )
);
于 2014-08-21T07:40:18.110 に答える