2013-04-04 20 views
7

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?

+0

Próbowałeś usuwania Id z routevaluedictionary przed przekierowaniem? – Slicksim

+0

Możesz także wypróbować 'RedirectToRoute' zamiast' RedirectToAction'. – danludwig

+0

@Slicksim Którym "RouteValueDictionary" mówisz? Czy mógłbyś podać przykład kodu, który masz na myśli? – Jez

Odpowiedz

10

Dzięki @Slicksim okazało się, że odpowiedź jest wyjąć kluczyk ze RouteData.Values raczej niż ustawienie go na 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) 
} 
Powiązane problemy