3

我要做的是使用 UriBuilder 和 HttpUtility.ParseQueryString 来获取用户访问的最后一页,然后解析 URL 以获取 productID。(如果重要,每个页面上的产品 ID 都不同)

示例 URL:website.com/stuff/?referrerPage=1&productID=1234567&tab=Tile

而我想要的只是 1234567

Page_Load 是我解析 URL 的地方:

protected void Page_Load(object sender, EventArgs e) 
{ 
    NameValueCollection query = HttpUtility.ParseQueryString(uriBuilder.Query);
    //I want to take the parse string and get productID here, how?
} 

GrabURL 是我最后一次访问的 URL:

public grabUrl(string Uri) 
{ 
    UriBuilder uriBuilder = new UriBuilder(Request.UrlReferrer); 
    return uriBuilder.Uri; 
}

我的代码在正确的轨道上吗?如何将产品 ID 号放入某个东西以便我可以使用它?我对 c# 和这种类型的编码非常陌生……当我说新的时候,我的意思是我已经做了大约一个星期。因此,任何详细的解释或示例都将非常受欢迎。感谢大家的帮助,我从这个网站学到了很多东西,让我走上了正确的道路。

4

3 回答 3

2

然后,NameValueCollection您可以执行以下操作:

var id = query["ProductID"];

您可以使用int.TryParse将其转换为适当的整数。

int id = 0;
if (!string.IsNullOrEmpty(query["ProductID"]) && 
  int.TryParse(query["ProductID"], out id))  {
  // use id here..
}
于 2013-05-10T14:53:12.557 回答
1

或者您可以使用 Request.QueryString() 从您的 URL 请求查询字符串值

protected void Page_Load() 
{ 
    //save yourself the conversion to int and just save it as Int if you know for sure
    // it will always be int
    int _prodID= Request.Querystring["productID"];
    //validate _prodID
    if (!string.IsNullOrEmpty(_prodID.toString())) {//do something }
}
于 2013-05-10T15:59:33.937 回答
0

你可以使用正则表达式来解析它吗?

string uri = "website.com/stuff/?referrerPage=1&productID=1234567&tab=Tile";
var rgx = new Regex("productID=(?<pid>[0-9]+)", RegexOptions.IgnoreCase);
string pid = rgx.Match(uri).Groups[1].Value;

编辑:提供上下文,正如我应该做的那样:

提及此选项的原因是,虽然它不使用HttpUtility.ParseQueryString,但您最初的问题非常具体:

只获取产品ID

用户访问的最后一页

(我理解这不是当前请求的 uri)。此外,您提供的 Uri 以字符串格式提供。

您问题中的方法是这样做的:

  • 接受 Uri(一个string变量)
  • 传递给UriBuilder; UriBuilder在其构造函数中初始化 a Uri,它本身通过创建更多字符串等来验证 uri、填充属性等大量工作
  • 然后,从Uri生成的对象中,您现在可以使用该Query属性 - 这是Uri已分配的新字符串之一
  • 传递给HttpUtility.ParseQueryString. 这会创建一个HttpValueCollection,它本身会逐个字符地迭代您传入的字符串以解析出查询字符串中的键值对,并将它们粘贴到 NameValueCollection 中,最终将您的值存储在一个ArrayList- 最少的.NET 中的高效集合(请参阅各种参考资料,包括这个 - What's Wrong with an ArrayList?),因为它将所有内容都存储在对象数组中,每次取出时都需要强制转换。
  • 最后,您可以通过密钥搜索该集合以获取您的产品ID。

这是一大堆字符串和字符分配,对象之间的转换,将事物放入索引数组中然后扫描等等,只是为了获得:

  • 一个可由另一个字符串中的模式识别的字符串

虽然我承认内存很便宜,但似乎可能有同样好的或更好的替代方案。这就是正则表达式的用途 - 在字符串中找到一个模式,并允许您将该模式的一部分取出。

所以,你的选择:

  1. 如果您只想以精确的形式从 uri 中获取 productID,并且 uri 最初是在字符串中,那么我认为正则表达式是一个非常好的、有效的选择。如果您想从 uri 中提取其他模式,这也将起作用。
  2. 如果您想知道查询字符串中的所有键以及特定键的值,请使用您的HttpUtility.ParseQueryString方法;允许您通过属性NameValueCollection访问密钥。AllKeys
  3. 如果您想获取当前请求的 uri 的查询字符串参数的值,那么 Marcianin 的答案是最简单的选择,您可以忘记前两个选项。

在所有情况下,一旦您有了字符串,您就可以使用 int 上的 parse 方法对其进行解析,但如果您使用 2. 或 3. 您提取的 id 可能不是数字(在恶意请求的情况下),因此请确保您使用int.TryParsenotint.Parse从字符串转换,并小心捕获异常。在从查询字符串中获取输入时,您应该始终小心,以免与查询字符串中的恶意数据(一旦在线就会频繁访问您的网站)发生冲突。

选择是个人喜好。

  • 您编写的实际代码大致相同——每种方法只占用很少的几行代码。
  • 代码永远不应该过早地优化,但如果它可以帮助它也不应该故意浪费。您可以对另一个进行性能测试,但这会浪费您在此阶段的时间。
  • 但是,代码也应该传达意图。即使我认为,Regex 方法也不能像 ParseQueryString 方法那样传达您的意图。

脚注:我会稍微更改正则表达式"[?&]productID=(?<pid>[0-9]+)"以确保您只选择“productID”而不是“fooProductID”

最重要的是,你问

我的代码在正确的轨道上吗?

我会说你是。在您继续进行时,请始终权衡不同的选项。不要害怕尝试不同的东西。你说你是 C# 的新手。在这种情况下,您可能错过的一件事是在编写代码之前编写一个测试来帮助您:如果测试通过,则代码是正确的,您选择的方法是次要的。如果您使用的是最新版本,Visual Studio 可以让您轻松进行测试。如果您尽早养成良好的习惯,它将在您以后的 C# 职业生涯中获得回报。

如何将产品 ID 号放入某个东西以便我可以使用它?

格兰特托马斯完美地回答了这个问题 - int.TryParse 将字符串转换为数字。

于 2013-05-10T14:53:17.397 回答