我正在使用Post-Redirect-Get模式。 在我的asp.net MVC核心的Web應用程序,這是發生了什麼:在沒有使用TempData的情況下成功發出POST請求後重定向後顯示消息
- 用戶提交通過POST一種形式,增加了一個項目數據庫。
- 控制器添加新項目並將302/303重定向到「/ Home/Index/xxxx」,其中xxxx是項目的ID。
- 新請求(/ 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 });
}
有幾個方式做到這一點,我在計算器上其他的答案中。
- 重定向到「/ Home/Index/xxxx?success = true」。當action看到成功= true參數時,它可以顯示成功消息。但我不想使用額外的參數,因爲我希望用戶能夠從地址欄中複製網址並共享它。我不希望他們分享具有成功參數的網址,因爲每個點擊共享鏈接的人都會看到消息「已成功添加商品」。
- 這個post建議使用TempData,這是一個很好的解決方案。我認爲這需要我在服務器上啓用粘性行爲,如果可能,我希望避免這種行爲。
- 我大概可以使用referrer url來確定請求是否在表單提交後發生,並且在那種情況下我可以顯示消息。
根據您的情況,我會建議使用TempData。 – Dilip
那些對此投票,你會介意留下評論解釋爲什麼?我使用了太多標籤嗎?或者這個問題看起來像是重複的?我做了徹底的研究,並列出了一些常用的解決方案(並鏈接了一個),並解釋了爲什麼我仍在尋找答案。下面的史努比的答案幫助我找到了正確的解決方案。 – Turbo
我對類似的困境有類似的回答。我知道如何做到這一點,但由於我們的網絡基礎設施,我不是那種方法的粉絲,並且對我不知道如何正確實施的備選方案提出了一些想法。我想人們會看到「這個人問哪種方式更好,因此它是基於意見的,而不是一個真正的問題。」而不是「嘿,這個人至少想到了可能的解決方案,而不是隻發佈一個問題,並要求每個人都爲他弄明白。」 –