2011-12-01 128 views
1

我試圖在視圖中通過actionLink()調用控制器。該控制器從TempData存儲庫中獲取數據。但是,似乎無論我做什麼,如果我在視圖中設置TempData存儲庫,它不會轉到控制器?我應該用ViewData代替嗎?你對這樣的系統有什麼建議?TempData從視圖移動到控制器

謝謝

+0

你不應該從視圖中設置TempData,如果你需要的話,考慮改變你的設計 –

回答

2

TempData,也不應該ViewData被設置在視圖中。一個視圖應該使用已存儲在控制器動作內部的結構中的數據(實際上,視圖不會消耗視圖模型,但這是另一個主題)。

當您想要在兩個重定向之間保存信息時,可以使用TempData。它應控制器的動作會被重定向到另一個控制器動作將讀取裏面的數據進行設置:

public ActionResult Foo() 
{ 
    SomeModel model = ... 
    TempData["foo"] = model; 
    return RedirectToAction("Bar"); 
} 

public ActionResult Bar() 
{ 
    var model = TempData["foo"] as SomeModel; 
    ... 
} 

所以控制器動作應該得到只有在這一行動已經從另一個重定向之後被調用從TempData的結構數據設置數據的操作。這種控制器操作決不應該從視圖中調用,因爲如果你有一個視圖,這意味着這個視圖是從一個控制器動作呈現的,可能會將數據設置爲TempData,但總是存在風險(如果視圖在請求到服務器 - AJAX或其他),TempData將會丟失。

對於你的情況,當一個視圖需要調用服務器基本上有3個技巧:

  • 使用HTML <form>輸入字段,將數據發送到服務器
  • 使用錨和傳遞數據作爲查詢字符串參數到控制器
  • 使用JavaScript和發送AJAX請求或重定向到服務器
+0

我害怕這一點。那麼,如果從TempData存儲庫獲取數據,那麼如何處理頁面從按鈕(從表單創建)刷新?目前通過按鈕刷新,我只需再次從actionLink調用控制器......存在這個問題。該控制器從TempData存儲庫中獲取一些信息。如果我打電話,它的空頁面將無法正確重新加載。有沒有更好的方法來做到這一點? – SoftwareSavant

+0

@DmainEvent,這正是TempData的一個問題。頁面用F5刷新。它可能是一個PITA。我個人從不使用TempData。如果我需要堅持一些東西,以便它能夠在頁面刷新後繼續存在,我會將其保留在我的後端,以便我可以隨時根據其唯一標識符檢索它。 TempData實際上應該用於非常短暫的對象存儲機制:比如通知消息等。 –

+0

你會如何將它存儲在後端?像數據庫一樣,還是有像使用會話這樣的機制? – SoftwareSavant

2

應設置預先顯示您的視圖的控制器中的值。然後該值將由呈現您的第二個(ActionLink)視圖的控制器操作獲取。

相關問題