2011-12-11 57 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通过一次重定向持续存在。