将参数传递给控制器,但不是URL

本文关键字:URL 参数传递 控制器 | 更新日期: 2023-09-27 18:18:57

是否有一种方法可以将参数传递给控制器而无需将其放在URL上?

例如,

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

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

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

将参数传递给控制器,但不是URL

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

使用TempData,正如其他人建议的那样,不是一个健壮的解决方案。它不会对页面上的链接起作用,只是POST之后的GET,然后只有一次,因为TempData在下一个请求后被删除。

嗯,你有几个选择:

  1. 这是一个表单帖子吗?如果是这样,那么您只需在提交表单时向表单添加一个特定的键值对,然后数据就会传递下去。
  2. 该资源的URL是唯一的吗?例如,"wine -chianti-doc -la-moto"是否作为数字19的唯一表示存在于某个数据库中?如果是这样,那么你可以简单地在数据库中查找路由组件来检索你需要的值(或者将逻辑一直推到数据库中)。
  3. 是一个不期望改变一堆的值吗?您可以在Session或cookie中设置该值,该值将跨页面持久化,然后从相应的集合中提取。
  4. 您是否从服务器上的其他请求重定向到此页面?如果是这样,那么您可以使用TempData来存储这个临时值。然而,我不建议这种方法,因为它是非常短暂的,在我看来不是很好的做法。
  5. 最后,如果你不想让用户容易编辑,你可以模糊URL上的值。用某种算法加密它,然后在目标页面上解密它。用户不太可能通过在URL中键入不同的值来更改ID。

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

但是,如果与安全无关,允许用户更改该号码并没有什么错,并且通常在url中显示类似的非重要信息。

在这种情况下应该使用TempData。在这个博客上可以找到一个很好的阅读。

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    };