2013-04-04 15 views
7

Tôi muốn chuyển hướng đến một hành động trong cùng một bộ điều khiển, nhưng mất giá trị tuyến đường (cụ thể là giá trị id). Điều này hóa ra lại rất khó khăn. Tôi có tuyến cấu hình như thế này:Có thể xóa các giá trị tuyến đường bằng RedirectToAction không?

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

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

... và một phương pháp hành động bên trong EventsController một cái gì đó như thế này:

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

    // (code to display status) 
} 

Nếu tôi sau đó truy cập vào một cái gì đó giống như /Monitoring/Events/1001, các RedirectToAction thực sự là gọi, nhưng tôi được chuyển hướng đến /Monitoring?id=1001 thay vì chỉ /Monitoring. Có vẻ như nó khớp với tuyến đường đầu tiên, Monitoring_controllerIdSpecified, mặc dù tuyến đường đó có thông số tuyến bắt buộc là id và tôi đã yêu cầu đặt số id thành vô giá trị, và bizarrely chuyển id thành khóa chuỗi truy vấn. Nói cách khác, nó không được xóa/xóa giá trị tuyến đường id. Đặt id thành một chuỗi trống trong đối tượng routeValues được chuyển đến RedirectToAction chỉ cung cấp cùng một hiệu ứng như đặt nó thành null.

Tại sao nó làm điều này và làm cách nào tôi có thể thuyết phục nó không khớp với tuyến đường đầu tiên vì id đã bị xóa hoàn toàn khỏi giá trị tuyến đường?

+0

có bạn đã cố gắng loại bỏ các Id từ routevaluedictionary trước khi chuyển hướng? – Slicksim

+0

Bạn cũng có thể thử 'RedirectToRoute' thay vì' RedirectToAction'. – danludwig

+0

@Slicksim 'RouteValueDictionary' nào bạn đang nói đến? Bạn có thể đưa ra một ví dụ về ý nghĩa của mã không? – Jez

Trả lời

10

Nhờ @Slicksim tôi thấy rằng câu trả lời là để loại bỏ các key từ RouteData.Values chứ không phải thiết lập nó để 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) 
} 
Các vấn đề liên quan