让我先尝试在这里设置方案。这是使用ASP.NET 4.0,MVC3和C#完成的。
我有一个图片库。我有图片库中专辑的经理。每个图库都有一组页面。
当我使用相册的经理时,视图会显示当前相册的列表。
在相册列表中,可以选择编辑,删除或管理该相册中的页面。
当选择管理相册的页面时,会有一个页面列表,每个页面都有编辑,删除和查看。
当选择页面的编辑按钮并进行编辑然后保存时,我的问题就出现了。
从相册列表中获取要管理的页面列表的按钮通过post发送id以隐藏albumid和其他参数。
因此页面视图是从[HttpPost]控制器生成的。然后,从管理页面的视图中,当单击编辑按钮时,出于相同的原因(隐藏参数)从[HttpPost]控制器生成用于编辑的页面。
问题出现了:在编辑视图中单击保存按钮后,数据将通过[HttpPost]发布到保存更改控制器,但我不想返回编辑视图(刷新会重新发布更改,它是不是最好的做法)。我想返回所选专辑的页面列表。在这样做时,我使用编辑控制器中的[HttpPost]重定向回[HttpGet]控制器,以查看列出所选专辑页面的视图。当我这样做时,呼叫看起来像这样:
return RedirectToAction("ManagePages", new { albumId = model.AlbumId });
不幸的是,该网址显示了相册ID:http://XXX/ManagePages?AlbumId=56。
如何在不在参数列表中显示相册ID的情况下返回相同选定相册的ManagePages视图?
答案 0 :(得分:1)
您可以在执行重定向之前将相册ID存储在TempData中:
TempData["AlbumId"] = model.AlbumId;
return RedirectToAction("ManagePages");
然后在ManagePages GET操作中,您可以阅读id的内容:
int albumId = (int)TempData["AlbumId"];
注意:一旦读取了id,TempData [“AlbumId”]的内容将被清除。
更新
实际上,如果您使用TempData并且用户单击刷新,那么数据将在刷新时丢失。因此,您可以使用会话:
Session["AlbumId"] = model.AlbumId;
...
int albumId = (int)Session["AlbumId"];
答案 1 :(得分:0)
在执行RedirectToAction之前,您可以使用相册ID设置Cookie。然后在ManagePages操作中阅读它。
但是,值得一提的是,如果您对外部已知的内部ID很敏感,那么您的应用程序仍会通过HTML源公开它们。除非您具有某种身份验证机制,否则其他用户可以使用它们来查看他们不认为的数据。
答案 2 :(得分:0)
您可以在TempData变量中隐藏ID。 TempData通过一次重定向持续存在。