2011-09-29 91 views
16

我想在RedirectToAction中傳遞對象。這是我的代碼:在RedirectToAction中傳遞對象

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

其中searchJob是SearchJob的實例。但是我沒有獲取有關SearchJob操作方法的數據。相反,我得到了searchJob的查詢字符串= Entity.SearchJob。請幫幫我。我究竟做錯了什麼?

+1

你看過'RedirectToAction'的文檔嗎? – bzlm

+0

什麼是具有SearchJob操作的控制器?它是同一個控制器嗎? –

+0

沒有SearchJob是控制器,它具有名爲SearchJob的操作。 – Jaggu

回答

28

您不能將類傳遞給重定向的動作。重定向是通過url完成的。鏈接字符串,因此它不能包含類(序列化對象的網址是真的出邏輯這裏

相反,你可以使用TempData

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

,並在行動中重定向

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

在執行上面的代碼之後,TempData將不再包含searchJob。 TempData通常用於單次讀取。

但我不喜歡上面的方式。如果我處在你的位置,並希望通過名稱搜索的工作,我想補充routeParameters像

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

,並通過參數

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

這樣,它接收到的動作,你會得到更好的用戶和http友好的url,從Action的角度來看,它會從外部獲得它需要的所有參數。這對測試,維護等更好。

0

如果您想通過查詢字符串或通過POST傳遞整個對象,則無法將類傳遞給RedirectToAction方法,您可以使用XML或JSON序列化對象並反序列化接收器控制器中的對象。 如果使用這種方法要小心序列化對象的大小。

16

您可以試試:

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

薪火searchJob對象爲RouteValueDictionary構造函數將分解searchJob對象和SearchJob類的每個屬性傳遞作爲頂級路線值。

使用默認的模型粘合劑,一個動作定義爲:

public ActionResult SearchJob(SearchJob searchJob) 

會收到一個完全重新水合SearchJob對象。

+0

它真的適用於簡單對象。但嵌套對象爲空。我將不得不使用TempData來代替複雜的對象。 – Sven

+0

在將對象傳遞給RouteValueDictionary構造函數之前,@Sven是否填充了您的值? – Charlie

+0

是的,該對象之前填充。 – Sven