2011-12-11 78 views
1

讓我試着首先在這裏設置場景。這是使用ASP.NET 4.0,MVC3和C#完成的。發佈重定向獲取隱藏URL參數

我有一個圖片庫。我有一個圖片庫中相冊的經理。每個畫廊都有一組頁面。

當我使用相冊管理器時,該視圖顯示當前相冊的列表。

在相冊列表中,可以選擇編輯,刪除或管理該相冊中的頁面。

選擇管理相冊的頁面時,會出現一個頁面列表,每個頁面都有編輯,刪除和查看。

當頁面的編輯按鈕被選中,編輯完成並保存後,遇到我的問題。

用於從相冊列表中獲取要管理的頁面列表的按鈕將通過發送ID來隱藏albumid和其他參數。

因此,頁面視圖是從[HttpPost]控制器生成的。然後,從視圖管理頁面,單擊編輯按鈕時,出於同樣的原因(隱藏參數),從[HttpPost]控制器生成編輯頁面。

這是問題:一旦在編輯視圖中單擊保存按鈕,數據將通過[HttpPost]發佈到保存更改控制器,但我不想返回編輯視圖(刷新會重新發布更改和它並不是最佳實踐)。我想返回到所選專輯的頁面列表。在此過程中,我使用編輯控制器中的[HttpPost]重定向到[HttpGet]控制器,以查看列出所選專輯頁面的視圖。當我這樣做,調用看起來是這樣的:

return RedirectToAction("ManagePages", new { albumId = model.AlbumId }); 

這不幸使URL具有所示的相冊ID:http://XXX/ManagePages?AlbumId=56

如何返回到同一所選專輯的ManagePages視圖,而不顯示參數列表中的專輯ID?

回答

1

你可以存儲在TempData的相冊ID只是執行使用重定向之前:在ManagePages

TempData["AlbumId"] = model.AlbumId; 
return RedirectToAction("ManagePages"); 

然後讓行動,你可以讀取ID的內容:

int albumId = (int)TempData["AlbumId"]; 

注:一旦讀取了id,TempData [「AlbumId」]的內容將被清除。


更新:

其實,如果你使用的TempData和用戶點擊刷新,則數據將丟失的刷新。因此,你可以改用會話:

Session["AlbumId"] = model.AlbumId; 
... 
int albumId = (int)Session["AlbumId"]; 
+1

此外,如果用戶刷新剛剛收到這個TempData的頁面上,將在頁面失敗,因爲它期待有哪個不是在渲染之後發送的數據? –

+1

我已更新我的答案以使用會話。 TempData實際上可能是最適合傳遞錯誤消息的地方,在刷新時丟失它們並不重要。不過,我自己會考慮將ID作爲RedirectToAction()的一部分傳遞給URL。只要您知道(並執行任何所需的服務器端檢查),因爲黑客可能會將其更改爲不同的ID(有效或無效),所以將ID暴露給用戶並不壞。 – Dangerous

+0

a)是否正在更改所有惡意用戶可以做的ID? b)在httpget上,我可以重新分配tempdata並保留它,直到它需要再次讀取或被認爲是不好的做法 –

0

在執行RedirectToAction之前,您可以使用相冊ID設置cookie。然後在ManagePages操作中閱讀它。

但是,值得指出的是,如果您對外部已知的內部ID敏感,您的應用程序仍然通過HTML源顯示它們。其他用戶可以使用它們來查看他們不認爲的數據,除非您擁有某種身份驗證機制。

0

您可以將ID隱藏在TempData變量中。 TempData通過一次重定向持續存在。