【问题标题】:How to read QueryString parameters from a url that's going to be Re-written and hide those parameters in the new re-written URL如何从将要重写的 url 中读取 QueryString 参数并将这些参数隐藏在新的重写 URL 中
【发布时间】:2011-06-03 00:12:44
【问题描述】:

我有两个示例向您展示我想要在这里实现的目标。 但是要指出我的问题有什么不同,是我有一个参数化的 URL,我想对我的应用程序实现 URL 重写。但我不想将 URL 中的参数转换为放在斜杠之间..."page.aspx?number=one" 为 "pages/one/"

第一个例子:

http://localhost:1820/Pages/Default.aspx?page=2&start=5

http://localhost:1820/Pages/page2

第二个例子:

http://localhost:1820/Items/Details.aspx?item=3

http://localhost:1820/Items/ItemName

但我仍然需要原始 URL 中的所有参数

【问题讨论】:

  • 两个问题:(1)你是怎么做URL重写的? (2) 如果有人直接访问localhost/Items/ItemName,你是否还希望能够说“'item'的值是多少”并得到答案“3”?
  • @Scott Mitchell- (1) 我还没用过。我希望看到一种好的方法来做我需要的事情。 (2) "item=3" 部分是数据库中这个项目的 id,我使用这个数字从我的数据库中检索等于 '3' 的项目。但为了 SEO 和清洁,我想隐藏项目索引并将其替换为它的名称(这也是数据库中的一个字段)

标签: c# asp.net sql webforms url-rewriting


【解决方案1】:

长话短说,您需要以某种方式存储未重写的查询字符串参数值与重写的 URL 参数值之间的关联。

例如,如果你正在重写:

http://localhost:1820/Items/Details.aspx?item=3

收件人:

http://localhost:1820/Items/Widgets

您必须在某处存储第 3 项,而小部件是同义词。很有可能,您已经在这样做了。我想在您的数据库中,您有一个带有 ProductIDProductName 列的 Products 表(或其他),并且有一条带有 ProductID=3ProductName=Widgets 的记录。

我建议使用 ASP.NET Routing 来处理 URL 重写。简而言之,您将定义一个类似Items/{ProductName} 的路由规则,并将其映射到ASP.NET 页面~/Items/Details.aspx。这样的路由规则说,“只要 URL 以 Items/whatever 的形式出现,就执行 ~/Items/Details.aspx 页面。”在~/Items/Details.aspx 页面中,您可以通过编程方式确定 URL 中的 ProductName 值(即,在此示例中,您可以确定用户正在访问项目/小部件)并从中加载/显示相应的信息。

查看我的这篇文章 - URL Routing in ASP.NET 4。它展示了如何使用 ASP.NET Routing(ASP.NET 3.5 SP1 及更高版本中的内置库)像您请求的那样使用 URL 重写。您还可以下载一个工作示例应用程序,该应用程序演示了本文中介绍的技术。

编程愉快!

【讨论】:

  • @Scott Mitchell-我没有开始使用你的答案,但到目前为止这很有意义!一个小问题,这种方法对我的应用程序可扩展性和性能有好处吗?还是只是一个技巧来完成它!
  • @IKashef:这对您的应用程序有好处。如果Products 表非常大,您需要确保ProductName 列(或任何出现在重写的URL 中的列值)上有索引。此外,最好有一个您实际使用的 ProductNameUrl 列,以防产品名称中包含非法 URL 字符。
  • @Scott Mitchell - 目前的产品大约是 200 个,但在未来两年内将扩展到大约 2-3 千个。但从一开始,网站的负载就会很大,因为它会有很多访问者。如果具有自动递增 int 字段的主键适用于您在 ProductName 上描述为索引的内容,那么是的。并感谢 ProductNameUrl 建议 +1
  • @Scott Mitchell-如果我发送有关给定 id (3) 的信息(名称)会怎样。说“id=3&name=shampoo”,这样我就可以使用我需要的参数(名称)并隐藏/忽略我不需要的参数(id),同时我保存了对数据库的额外访问权限和额外的代码和内存来存储这些值并对其进行操作。
  • @IKashef:您不能“隐藏”信息。如果一个 URL 带有查询字符串参数,则您正在向浏览器发送一个请求,说“不,改为转到这里”,因此新 URL 的新请求进入。没有办法记住查询字符串的值。此外,用户可能会立即使用“理想”的 URL(例如 /Items/Widgets),因此您需要能够从 Widgets 转到 ID,3。
【解决方案2】:

在您的示例中,您将完全从 URL 中删除数据,我认为这里不会有您想要的方式。

例如,您希望成为 /pages/page2 的带有 /default.aspx?page=2&start=5 的第一个 url。

理论上,default.aspx?page=2 和 default.aspx?page=2&start=5 可能是不同的行为。你想怎么表达。因为如果 /pages/page2 始终映射到第二个示例,您将无法调用前者。

我想我们需要更多地了解您要完成的工作。

【讨论】:

  • 请检查我的问题stackoverflow.com/questions/4578781/…。参考我刚刚发布的问题,您可以看到 page=2 和 start=5 永远配对,除非我更改 pageSize,否则这不会改变
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
相关资源
最近更新 更多