【问题标题】:Passing parameters to Controller ..but NOT on the URL将参数传递给控制器​​ ..但不在 URL 上
【发布时间】:2011-12-27 20:17:09
【问题描述】:

有没有办法将参数传递给控制器​​而不将其放在 URL 上?

例如, http://www.winepassionate.com/p/19/wine-chianti-docg-la-moto

在 URL 上的值为 19。如果您实际上将该值更改为另一个值,即使页面名称保持不变,页面也会显示不同的记录。

所以我不想在 URL 上传递 ID,但仍然能够将它传递给控制器​​。 推荐的方法是什么?

【问题讨论】:

  • 那么为什么还要传递第二个参数(我假设页面名称)。您的查询应该同时考虑,并且改变这不会(不应该)成为问题。

标签: c# asp.net-mvc-3 model-view-controller asp.net-mvc-routing


【解决方案1】:

您可以发布帖子并将其作为表单参数发送。我不推荐这个。帖子应该用于修改数据的请求。在这种情况下,您很可能只是为了获取该数据。 id 在 URL 中的事实是一件好事(请参阅 Stack Overflow URLs 以供参考)。如果您真的不希望用户能够修改它(我希望这不是因为您认为这使它更安全,因为它没有),您可以对其进行一些简单的加密以使其更难猜测/产生一个有效的 ID。

正如其他人所建议的那样,使用 TempData 并不是一个可靠的解决方案。它不适用于页面上的链接,只是 POST 之后的 GET,然后只有一次,因为 TempData 在下一次请求后被删除。

【讨论】:

    【解决方案2】:

    嗯,你有几个选择:

    1. 这是一个表单帖子吗?如果是这样,那么您可以在提交表单时简单地将特定的键值对添加到表单中,然后数据将被传递。
    2. 该资源的 URL 是唯一的吗?即“Wine-chianti-docg-la-moto”是否作为数字 19 在某处数据库中的唯一表示存在?如果是这样,那么您可以简单地在数据库中查找该路由组件以检索您需要的值(或将该逻辑一直推送到数据库)。
    3. 这是一个不会改变一堆的值吗?您可以在 Session 或 cookie 中设置该值,该值将跨页面持久保存,然后从相应的集合中提取。
    4. 您是否从服务器上的另一个请求重定向到此页面?如果是这样,那么您可以使用TempData 来存储这个临时值。但是,我建议不要使用这种方法,因为它是非常短暂的,在 imo 中不是很好的做法。
    5. 最后,如果您不想让用户轻松编辑 URL,可以隐藏 URL 上的值。使用某种算法对其进行加密,然后在目标页面上对其进行解密。用户不太可能通过在 URL 中输入不同的值来更改 ID。

    【讨论】:

      【解决方案3】:

      如果页面是 GET,并且您按照应有的方式关注 PRG(Post-Redirect-Get),那么您可以使用 TempData["dataName"] = value;在您的 [HttpPost] 控制器中,然后在您的 [HttpGet] 方法中使用它。这实际上取决于页面的调用方式。

      但是,如果与安全无关,让用户更改该数字并没有错,并且在 URL 中显示非重要信息是常见的做法。

      【讨论】:

        【解决方案4】:

        在这种情况下,您应该使用 TempData。可以在on this blog 找到有关此内容的好读物。

        TempData 允许您在请求之间临时存储一个值,默认情况下,在被访问后会被删除。

        // TempData samplepublic ActionResult Featured(){    var featuredProduct = new Product    {        Name = "Assorted Cupcakes",        Description = "Delectable vanilla and chocolate cupcakes",        CreationDate = DateTime.Today,        ExpirationDate = DateTime.Today.AddDays(7),        ImageName = "cupcakes.jpg",        Price = 5.99M,        QtyOnHand = 12    };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-14
          • 2014-11-04
          • 2011-08-17
          • 1970-01-01
          • 2015-09-13
          相关资源
          最近更新 更多