将参数传递给Controller ..但不在URL上

时间:2011-12-27 20:17:10

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

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

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

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

所以我不想在URL上传递ID,但仍然可以将其传递给Controller。 建议的方法是什么?

4 个答案:

答案 0 :(得分:3)

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

正如其他人所说,使用TempData并不是一个强大的解决方案。它不适用于页面上的链接,仅适用于POST后的GET,然后只能在下一个请求后删除TempData时使用一次。

答案 1 :(得分:3)

嗯,你有几个选择:

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

答案 2 :(得分:2)

如果页面是GET,并且您正在跟踪PRG(应用后重定向),则可以使用TempData [“dataName”] = value;在[HttpPost]控制器中,然后在[HttpGet]方法中使用它。这实际上取决于页面的调用方式。

但是,如果用户没有与安全性相关,那么让用户更改该号码并没有错,并且通常会在网址中显示非重要信息。

答案 3 :(得分:0)

在这种情况下你应该使用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    };