Chcę przekierować do działania w tym samym kontrolerze, ale tracę wartości trasy (w szczególności wartość id
). To okazuje się zaskakująco trudne. Mam trasy skonfigurowane tak:Czy można usunąć wartości tras za pomocą opcji RedirectToAction?
context.MapRoute(
"Monitoring_controllerIdSpecified",
"Monitoring/{controller}/{id}/{action}",
new { action = "Status" }
);
context.MapRoute(
"Monitoring_default",
"Monitoring/{controller}/{action}",
new { controller = "Events", action = "Index" }
);
... i metodę działania wewnątrz EventsController
coś takiego:
public ActionResult Status(int id) {
if (id > 1000) {
TempData["ErrorMessage"] = "ID too high.";
return RedirectToAction("Index", new { id = (int?)null });
}
// (code to display status)
}
Gdybym wtedy dostęp coś /Monitoring/Events/1001
The RedirectToAction
rzeczywiście jest wywoływany, ale zostanie przekierowany na numer /Monitoring?id=1001
zamiast tylko /Monitoring
. Wydaje się pasować do pierwszej trasy, Monitoring_controllerIdSpecified
, mimo że ta trasa ma id
jako obowiązkowy parametr trasy i powiedziałem jej, aby ustawić id
na wartość null, i dziwnie zamieniając id
na klucz ciągu zapytania. Innymi słowy, nie usuwa on prawidłowo wartości trasy. Ustawienie id
na pusty ciąg znaków w obiekcie routeValues
przekazanym do RedirectToAction
powoduje tylko taki sam efekt, jak ustawienie go na null
.
Dlaczego to robi i jak mogę przekonać, że nie pasuje do pierwszej trasy, ponieważ id
zostało całkowicie usunięte z wartości trasy?
Próbowałeś usuwania Id z routevaluedictionary przed przekierowaniem? – Slicksim
Możesz także wypróbować 'RedirectToRoute' zamiast' RedirectToAction'. – danludwig
@Slicksim Którym "RouteValueDictionary" mówisz? Czy mógłbyś podać przykład kodu, który masz na myśli? – Jez