2013-04-04 10 views
7

Ich möchte zu einer Aktion in der gleichen Controller umleiten, aber die Route Werte verlieren (insbesondere die id Wert). Dies erweist sich als überraschend schwierig. Ich habe Routen wie folgt konfiguriert:Können die Routenwerte mit RedirectToAction gelöscht werden?

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

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

... und eine Aktion Methode in EventsController etwas wie folgt aus:

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

    // (code to display status) 
} 

Wenn ich dann so etwas wie /Monitoring/Events/1001 zuzugreifen, wird die RedirectToAction zwar aufgerufen, aber ich umgeleitet werden zu /Monitoring?id=1001 statt nur /Monitoring. Es scheint die erste Route, Monitoring_controllerIdSpecified, zu entsprechen, obwohl diese Route id als obligatorischer Route-Parameter hat und ich habe es id auf null festgelegt und bizarrerweise id in einen Abfragezeichenfolgenschlüssel verwandelt. Mit anderen Worten, es löscht/entfernt den id Routenwert nicht ordnungsgemäß. Die Einstellung von id auf eine leere Zeichenfolge im Objekt routeValues, das an RedirectToAction übergeben wird, hat denselben Effekt wie die Einstellung auf null.

Warum macht es das und wie kann ich es davon überzeugen, nicht die erste Route zu entsprechen, weil id vollständig aus den Routenwerten entfernt wurde?

+0

haben Sie versucht, die ID aus der Routevaluedictionary zu entfernen, bevor Umleitung? – Slicksim

+0

Sie könnten auch 'RedirectToRoute' anstelle von' RedirectToAction' versuchen. – danludwig

+0

@Slicksim Welchen 'RouteValueDictionary' redest du? Können Sie mir einen Code geben, was Sie meinen? – Jez

Antwort

10

Dank @Slicksim fand ich, dass die Antwort ist, den Schlüssel von RouteData.Values anstatt es zu null entfernen Einstellung:

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

    // (code to display status) 
} 
Verwandte Themen