11

同じコントローラー内のアクションにリダイレクトしたいのですが、ルート値 (特にid値) を失います。これが意外と難しくなっています。私は次のように構成されたルートを持っています:

context.MapRoute(
    "Monitoring_controllerIdSpecified",
    "Monitoring/{controller}/{id}/{action}",
    new { action = "Status" }
);

context.MapRoute(
    "Monitoring_default",
    "Monitoring/{controller}/{action}",
    new { controller = "Events", action = "Index" }
);

EventsController...そして、次のような内部のアクションメソッド:

public ActionResult Status(int id) {
    if (id > 1000) {
        TempData["ErrorMessage"] = "ID too high.";
        return RedirectToAction("Index", new { id = (int?)null });
    }

    // (code to display status)
}

次に のようなものにアクセスすると/Monitoring/Events/1001RedirectToAction確かに が呼び出されますが、/Monitoring?id=1001だけではなく にリダイレクトされ/Monitoringます。最初のルート に一致しているようMonitoring_controllerIdSpecifiedですが、そのルートにはid必須のルート パラメータがあり、idnull に設定するように指示し、奇妙にidクエリ文字列キーに変わります。つまり、idルート値を適切にクリア/削除していません。に渡さidれたオブジェクトで空の文字列を設定すると、 に設定した場合と同じ効果が得られます。routeValuesRedirectToActionnull

idなぜこれを行うのですか?ルート値から完全に削除されているため、最初のルートと一致しないようにするにはどうすればよいですか?

4

1 に答える 1

14

@Slicksim のおかげで、答えはキーRouteData.Valuesを null に設定するのではなく、キーを削除することであることがわかりました。

public ActionResult Status(int id) {
    if (id > 1000) {
        TempData["ErrorMessage"] = "ID too high.";
        RouteData.Values.Remove("id");
        return RedirectToAction("Index");
    }

    // (code to display status)
}
于 2013-04-08T10:42:02.223 に答える