1

我正在使用Post-Redirect-Get模式。 在我的asp.net MVC核心的Web應用程序,這是發生了什麼:在沒有使用TempData的情況下成功發出POST請求後重定向後顯示消息

  1. 用戶提交通過POST一種形式,增加了一個項目數據庫。
  2. 控制器添加新項目並將302/303重定向到「/ Home/Index/xxxx」,其中xxxx是項目的ID。
  3. 新請求(/ Home/Index/xxxx)由控制器提供,並顯示該項目。而地址欄中的項目url是用戶可以複製和共享的內容。

在上面的步驟3中,我想向用戶顯示一條消息,說明「項目已成功添加」。

這是我的代碼(沒有成功消息):

public async Task<IActionResult> Index(string id) 
{ 
    ItemView itemView = null; 
    if (string.IsNullOrEmpty(id)) 
     itemView = new ItemView(); // Create an empty item. 
    else 
     itemView = await itemService.GetItemAsync(id); 
    return View(itemView); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Index(ItemView itemView) 
{ 
    string id = await itemService.AddItemAsync(itemView); 
    return RedirectToAction("Index", "Home", new { id = id }); 
} 

有幾個方式做到這一點,我在計算器上其他的答案中。

  1. 重定向到「/ Home/Index/xxxx?success = true」。當action看到成功= true參數時,它可以顯示成功消息。但我不想使用額外的參數,因爲我希望用戶能夠從地址欄中複製網址並共享它。我不希望他們分享具有成功參數的網址,因爲每個點擊共享鏈接的人都會看到消息「已成功添加商品」。
  2. 這個post建議使用TempData,這是一個很好的解決方案。我認爲這需要我在服務器上啓用粘性行爲,如果可能,我希望避免這種行爲。
  3. 我大概可以使用referrer url來確定請求是否在表單提交後發生,並且在那種情況下我可以顯示消息。
+0

根據您的情況,我會建議使用TempData。 – Dilip

+2

那些對此投票,你會介意留下評論解釋爲什麼?我使用了太多標籤嗎?或者這個問題看起來像是重複的?我做了徹底的研究,並列出了一些常用的解決方案(並鏈接了一個),並解釋了爲什麼我仍在尋找答案。下面的史努比的答案幫助我找到了正確的解決方案。 – Turbo

+1

我對類似的困境有類似的回答。我知道如何做到這一點,但由於我們的網絡基礎設施,我不是那種方法的粉絲,並且對我不知道如何正確實施的備選方案提出了一些想法。我想人們會看到「這個人問哪種方式更好,因此它是基於意見的,而不是一個真正的問題。」而不是「嘿,這個人至少想到了可能的解決方案,而不是隻發佈一個問題,並要求每個人都爲他弄明白。」 –

回答

1

「史努比」的原始答案確實指向了我的正確方向。但是由於某種未知的原因,這個答案不再存在,所以我自己發佈了答案,希望將來可以讓某人受益。

ASP .NET Core 1.1及更高版本支持基於Cookie的Tempdata提供程序,名爲CookieTempDataProvider。鏈接到Microsoft Docs

這與基於Session的Tempdata類似,但沒有數據存儲在服務器端。服務器在瀏覽器中設置一個cookie與您要存儲的數據的響應。來自瀏覽器的下一個請求將包含此cookie。該框架會自動解析並將其填充到控制器可以使用的TempData中。一旦控制器讀取此數據,CookieTempDataProvider會自動在響應中添加適當的標題以清除此Cookie。

在啓動類的ConfigureServices方法,你需要註冊CookieTempDataProvider:

services.AddSingleton<ITempDataProvider, CookieTempDataProvider>(); 

要存儲在基於Cookie臨時數據的一些數據,你簡單的設置像這樣在你的控制器值:

TempData["key"] = "value"; 

要讀取控制器中的數據,請將其讀取爲:

string value = TempData["key"]; 
if (value != null) 
{ 
    // Do something with the the value. 
} 

對非空的檢查告訴你該鍵是否存在於TempData中。請注意,您也可以使用.ContainsKey()方法進行檢查,但這不會算作讀取。數據(& cookie)不會被清除,除非您閱讀它。例如,這將不會清除數據:

if (TempData.ContainsKey("key")) 
{ 
// Do something without actually reading the value of TempData["key"]. 
} 
+0

謝謝,非常有幫助! – ygoe

相關問題