2011-09-29 29 views
16

Tôi muốn chuyển đối tượng trong RedirectToAction. Đây là mã của tôi:Truyền đối tượng trong RedirectToAction

RouteValueDictionary dict = new RouteValueDictionary(); 
      dict.Add("searchJob", searchJob); 
      return RedirectToAction("SearchJob", "SearchJob", dict); 

nơi searchJob là thể hiện của SearchJob. Nhưng tôi không nhận được dữ liệu về phương thức hành động SearchJob. Thay vào đó tôi nhận được chuỗi truy vấn của searchJob = Entity.SearchJob. Làm ơn giúp tôi. Tôi đang làm gì sai?

+1

Bạn đã xem tài liệu cho 'RedirectToAction' chưa? – bzlm

+0

Bộ điều khiển có hành động SearchJob là gì? Nó có cùng bộ điều khiển không? –

+0

Không có SearchJob là bộ điều khiển và nó có hành động có tên là SearchJob. – Jaggu

Trả lời

28

Bạn không thể chuyển lớp học cho các hành động được chuyển hướng như vậy. Chuyển hướng được thực hiện bằng url. Url là chuỗi, vì vậy nó không thể chứa các lớp học (serializing đối tượng để url là thực sự ra logic ở đây)

Thay vào đó, bạn có thể sử dụng TempData

TempData["searchJob"] = searchJob; 
return RedirectToAction ...; 

và trong hành động chuyển hướng

Entity.SearchJob = (Entity.SearchJob)TempData["searchJob"] ; 

Sau khi thực thi mã ở trên, TempData sẽ không chứa searchJob nữa. TempData thường được sử dụng để đọc một lần.

Nhưng tôi không thích cách trên. Nếu tôi là ở vị trí của bạn, và muốn tìm kiếm việc làm theo tên, tôi sẽ thêm routeParameters như

RouteValueDictionary dict = new RouteValueDictionary(); 
dict.Add("searchJobName", searchJob.JobName); 

và nhận được nó để hành động thông qua tham số

public ActionResult SearchJob(string searchJobName) 
{ 
... do something with name 
} 

Bằng cách này, bạn sẽ có được người dùng tốt hơn và http thân thiện url và từ điểm hành động của xem, nó sẽ nhận được tất cả các thông số cần thiết từ bên ngoài. Điều này tốt hơn để thử nghiệm, bảo trì, v.v.

-2

Hãy thử sử dụng Cross-Page Posting bạn có thể xác định Loại trang sử dụng trước và sử dụng đối tượng đó.

0

Bạn không thể chuyển lớp sang phương thức RedirectToAction, nếu bạn muốn truyền toàn bộ đối tượng trong chuỗi truy vấn hoặc qua POST, bạn có thể tuần tự hóa đối tượng bằng cách sử dụng XML hoặc JSON và deserialize đối tượng trong bộ điều khiển bộ thu. Nếu bạn sử dụng phương pháp này để cẩn thận về kích thước của đối tượng được tuần tự hóa.

16

Bạn có thể thử:

return RedirectToAction("SearchJob", "SearchJob", new RouteValueDictionary(searchJob) 

Đi qua các đối tượng searchJob vào constructor RouteValueDictionary sẽ phân hủy các đối tượng searchJob và vượt qua mỗi thuộc tính của lớp SearchJob như một giá trị tuyến đường cấp cao nhất.

Với mô hình mặc định chất kết dính, một hành động được định nghĩa là:

public ActionResult SearchJob(SearchJob searchJob) 

sẽ nhận được một đầy đủ lại ngậm SearchJob đối tượng.

+0

Nó thực sự làm việc cho các đối tượng đơn giản. Nhưng các đối tượng lồng nhau là null. Tôi sẽ phải sử dụng TempData thay cho các đối tượng phức tạp. – Sven

+0

@Sven là các giá trị của bạn được điền trước khi chuyển đối tượng đến phương thức khởi tạo RouteValueDictionary? – Charlie

+0

Có đối tượng được điền trước. – Sven

Các vấn đề liên quan