2011-07-17 60 views
1

想象一下,用戶可以更新,刪除,編輯甚至投票輸入的頁面。由於每個操作都將由不同的ActionResult處理,因此如果出現錯誤,頁面的url將不得不更改。我的問題很簡單:假設你的頁面是「http://localhost/Input/」,當你有一些錯誤時,我想重定向到「http://localhost/Input/Error」並顯示錯誤消息。我不想爲此使用會話,因此請不要告訴我這個link。基本上,只要我想做的事情,這是類似的東西:c#將一個字符串從一個動作傳遞到另一個

public ActionResult Create(FormCollection form) { 
     try { 
      // some code here 
      return RedirectToAction("Index"); 
     } 
     catch() { 
      string errorMessage = "You have done something bad!"; 
      // and I want to pass this string to my Error Action. 
      return RedirectToAction("Error"); 
     } 
} 

我用

我知道,我說我不想使用TempData的,但apparantly那就是解決方案最好的選擇,我用我的問題。至於答案,我選擇了DigBySwift的答案,因爲如果您不想使用Session進行此類操作,那麼這是最合乎邏輯的事情。

回答

4

正如你所說,如果你不想使用會話,TempData不是一個選項。理想情況下,您應該儘量不要將錯誤消息傳遞到下一頁。而是將錯誤消息存儲在資源文件中。

你可以通過一個id /枚舉你下一個頁面,然後檢索根據傳遞的參數錯誤:

return RedirectToAction("Error", new { ErrorId = 4 }); 

public ActionResult Error(int errorId){ ... } 

編輯:另一種(因爲DB寫讀會考慮昂貴)是將消息寫入cookie,然後在重定向後檢索它,然後刪除cookie。這不是很好,我個人不會使用這個。但是如果你需要自定義信息,這是一個選項。

+0

是的,這就是我會做,如果我找不到更好的方法:) – Shaokan

+0

這是我正在建議:) – Ankit

0

我想推薦一種替代方法。我使用AJAX來完成這些類型的操作,而不是將用戶重定向到另一個視圖,我可以從我的控制器返回一個視圖或大部分視圖。因此,我可以在我的視圖中使用ViewBag的字符串消息。

public ActionResult Create(FormCollection form) { 
    try { 
     // some code here 
     return View('CreationSuccess'); 
    } 
    catch() { 
     ViewBag.errorMessage = "You have done something bad!"; 
     // and I want to pass this string to my Error Action. 
     return View('CrudError'); 
    } 
} 
+0

不幸的是,我不使用AJAX呢。我對這個問題有點癡迷,我希望我的網頁可以使用或不使用js。因此,一旦我完整地運行整個網站沒有js然後我會添加AJAX功能 – Shaokan

+0

國際海事組織,這種方法的問題是,用戶可能只是刷新頁面,導致代碼重新運行和重新錯誤。特別是如果操作昂貴,這不是很好的做法。 Viewbag也僅限於MVC3,因此僅適用於.NET 4。 – Digbyswift

1

是否有一個選項可以將發件人頁面中的錯誤消息保存在數據庫中並將它重新放回另一頁面? 我知道它與上面發佈的類似,但它會更動態,因爲您不需要將該消息放在資源文件中,並且可以將錯誤消息保存在數據庫中並在其他頁面上獲取該文件

+0

這總是一個選項:)但我相信,因爲Digbyswift建議,最好在一個枚舉中存儲一個id,並像這樣使用:) – Shaokan

+0

是的,除非你想顯示自定義消息,這是一個不錯的選擇。 – Ankit

+1

對於自定義消息,您可以編寫一個cookie並在重定向上檢索它。我編輯了我的答案來描述這一點。在我看來,數據庫寫入然後讀取對於這個操作來說有點貴。 – Digbyswift

相關問題