【问题标题】:Post Redirect Get Hide URL Parameters发布重定向获取隐藏 URL 参数
【发布时间】:2012-01-18 00:36:25
【问题描述】:

让我先尝试在这里设置场景。这是使用 ASP.NET 4.0、MVC3 和 C# 完成的。

我有一个图片库。我有一个图片库相册的经理。每个画廊都有一组页面。

当我使用相册管理器时,视图会显示当前相册的列表。

在相册列表中,可以选择编辑、删除或管理该相册中的页面。

选择要管理专辑的页面时,有一个页面列表,每个页面都有编辑,删除和视图。

选择页面的编辑按钮,然后保存了编辑,遇到了我的问题。

从相册列表到要管理的页面列表的按钮通过post发送id来隐藏相册ID等参数。

所以页面的视图是从 [HttpPost] 控制器生成的。然后,从视图到管理页面,当点击编辑按钮时,出于同样的原因(隐藏参数)从[HttpPost]控制器生成编辑页面。

问题是:在编辑视图中单击保存按钮后,数据会通过 [HttpPost] 发布到保存更改控制器,但我不想返回编辑视图(刷新会重新发布更改,它是不是真正的最佳实践)。我想返回所选专辑的页面列表。为此,我使用编辑控制器中的 [HttpPost] 重定向回 [HttpGet] 控制器,以获取列出所选专辑页面的视图。当我这样做时,调用看起来像这样:

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

不幸的是,这使网址显示了专辑 ID:http://XXX/ManagePages?AlbumId=56

如何返回同一选定专辑的 ManagePages 视图而不在参数列表中显示专辑 ID?

【问题讨论】:

    标签: asp.net asp.net-mvc-3 http-post http-get redirecttoaction


    【解决方案1】:

    在执行 RedirectToAction 之前,您可以设置一个带有专辑 ID 的 cookie。然后在 ManagePages 操作中阅读它。

    但是,值得说明的是,如果您对外部已知的内部 ID 很敏感,您的应用程序仍然会通过 HTML 源公开它们。除非您有某种身份验证机制,否则其他用户可以使用它们来查看他们不应该查看的数据。

    【讨论】:

      【解决方案2】:

      您可以将 ID 隐藏在 TempData 变量中。 TempData 通过一个重定向持续存在。

      【讨论】:

        【解决方案3】:

        您可以在执行重定向之前将专辑 ID 存储在 TempData 中:

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

        然后在 ManagePages GET 操作中您可以读取 id 的内容:

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

        注意:一旦 id 被读取,TempData["AlbumId"] 的内容将被清除。


        更新:

        实际上,如果您使用 TempData 并且用户单击刷新,那么刷新时数据将丢失。因此,您可以改用 Session:

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

        【讨论】:

        • 另外,如果用户在刚刚接收到这个TempData的页面上刷新,页面是否会因为期望有渲染后没有发送的数据而失败?
        • 我已经更新了我的答案以也使用会话。 TempData 实际上可能最适合传递诸如错误消息之类的东西,如果它们在刷新时丢失并不重要。但是,我自己会考虑将 id 作为 RedirectToAction() 的一部分传递给 URL。只要您知道(并执行任何所需的服务器端检查),将 id 暴露给用户并没有那么糟糕,因为黑客可能会将其更改为不同的 id(有效或无效)。
        • a) 更改 id 是恶意用户所能做的吗? b) 在 httpget 上,我可以重新分配临时数据并将其保留到需要再次读取或被认为是不好的做法
        • a) 恶意用户可能会更改 URL 中传递的任何值或隐藏在表单中的任何值。如果您公开诸如专辑ID之类的ID,则应该没问题。许多在线购物网站在 url 中使用产品或类别 ID。如果您更改并提交它们,您将获得不正确的产品或类别(用户错误更改)或错误页面,无论哪种方式都不会造成伤害。只要您不在客户端上公开敏感信息,就可以了。请参阅以下链接的“任务 3 - 添加嵌入在 url 中的 Id 参数”:msdn.microsoft.com/en-us/gg592076
        • stackoverflow.com/questions/910683/… stackoverflow.com/questions/3629134/… MVC3 提供的默认路由:new { controller = "Home", action = "Index", id = "" } 你可以提供一个 url一个 id,只要您不暴露敏感信息,并且您要防止 id 的值可能与您预期的不同。但是,如果您返回错误页面,则用户会因更改而出错。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-13
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 2019-02-21
        • 1970-01-01
        相关资源
        最近更新 更多