2013-07-12 129 views
3

我想將一個控制器動作的類對象傳遞給不同控制器的動作。將類對象從一個控制器動作傳遞給ASP.net中的不同控制器動作MVC 4

發件人行動

public class CourseController : Controller 
{ 
[HttpPost] 
public ActionResult CreateNewCourse(CourseViewModelBase courseViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     // Do some stuff 
     return RedirectToAction("CreateNewProject", "Project", 
          new { courseVM = courseViewModel}); 
    } 
    // Bad happened  
    return View("CreateNewCourse", courseViewModel); 
} 

接收機行動

public class ProjectController : Controller 
{ 
[HttpGet] 
public ActionResult CreateNewProject(CourseViewModelBase courseVM) 
{ 
     // Use CourseVM data and do other stuff 
    return View("Create", projectCreateViewModel); 
} 
} 

我在發件人行動接收機行動正確獲取數據從重定向的行動呼籲正確調。但是courseVM in 接收器動作null

我知道這是一個非常古老的問題,並被重複詢問。但我發現大多數答案建議使用TempData並在2008/2009年得到了答案。我相信會有一些使用RedirectToAction without using TempData的數據。如果沒有,那麼我只會使用TempData。

查找 如果我傳遞一些簡單的數據,例如new {id = courseViewModel.CourseDuration}並將Receiver action中的參數更改爲id,然後正確接收id。

類似的問題 Question 1
Question 2
Question 3
Question 4
Question 5
Question 6, tried to use this one but did not workout
Question 7
Question 8
Question 9
Question 10

大多數上述問題的答案都可以追溯到2008/09和使用TempData的

回答

3

使用本

return RedirectToAction("ActionName", "ControllerName", modelObj); 
你的情況

return RedirectToAction("CreateNewProject", "Course", courseViewModel); 

您還可以使用

TempData 
+0

使用這種方法會有什麼壞處嗎?即不使用TempData或ViewBag – Rohit

+0

Rohit:我認爲「RedirectToAction」是最好的選擇。謝謝 – Chandu

+0

嗨Pawanism我在將課程虛擬機從View(.cshtml)發送給控制器時遇到麻煩。它始終爲空 – Rohit

4

這個問題本身是現在一歲,但我碰到它使我想我會幫助那些未來遇到它的人。接受的答案不起作用 - 複雜的對象仍然到達接收操作null。

我發現自2012年起this answer仍然有效。你只是不能傳遞HttpGet請求中的複雜對象(本質上這是一個RedirectToAction - 再次,不是你可以改變的東西)。你只能通過標值:整數,字符串等

確保你已經排除了以下兩種選擇:

  • 避免發送一個複雜的對象乾脆,只發送標量值。顯然這只是一種選擇,但我提到它是提醒我們考慮它。
  • 完全跳過接收Get操作 - 執行其邏輯&直接從Post操作返回View。即; return View("ReceivingViewName", viewmodel)再一次,只適用於某些情況,很可能您需要其他操作,因此需要重定向,但值得記住的可能性。

如果無法解決問題搞定了,已經消除上述兩種選擇,你的選擇是:

  • 將數據保存到數據庫,可能使用一個臨時表,如果你知道數據稍後將不會使用。將主鍵發送到接收操作,然後一次,查詢數據庫。這是「最乾淨的」選項。
  • [已編輯選項]將對象存儲在TempData中(數據僅持續到下一個使用的地方使用 - 如果未使用,則會在會話期間掛起)或會話(數據持續一生的會議)。兩者都不是很好的選擇。 TempData可能是兩者中較好的一個,因爲它的使用壽命可能會更短......但是您仍然必須考慮在發生頁面重新加載或對該方法進行後續請求時發生的情況(例如WebGrid分頁 - 是我的場景)。對於這些特定場景,我最初建議將數據從TempData中取出,然後重新放入,以便隨後對該操作發出請求。由於TempData實際上一直掛起,直到使用一次,這使得該選項更不理想,因爲如果用戶在別處導航它不會消失。關於這個答案的更多信息here。底線是不要把任何東西放在TempData中,除非你打算馬上使用它。如果你不需要分頁等特定場景的數據,並且你把它放在TempData中,並立即在接收方法中使用它,而不需要重新放入,這個選項就沒有問題。第一種選擇仍然更好。
相關問題