C# 如何使用UriBuilder和HttpUtility.ParseQueryString存储URL并对其进行解析

C# 如何使用UriBuilder和HttpUtility.ParseQueryString存储URL并对其进行解析,c#,asp.net,parsing,url,uribuilder,C#,Asp.net,Parsing,Url,Uribuilder,我试图做的是使用UriBuilder和HttpUtility.ParseQueryString获取用户访问的最后一个页面,然后解析URL以仅获取productID。(如有必要,每一页上的产品ID是不同的) 示例URL:website.com/stuff/?refererpage=1&productID=1234567&tab=Tile 我想要的只是1234567 页面加载是我解析URL的地方: protected void Page_Load(object sender, EventArgs e

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

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

我想要的只是1234567

页面加载是我解析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; 
}
我的代码正确吗?如何将productID号放入某个文件中,以便使用它?我对c#非常陌生,这种类型的编码通常。。。当我说“新”的时候,我的意思是我已经做了大约一个星期了。因此,任何详细的解释或示例都将非常有用。感谢大家的帮助,我从这个网站学到了很多东西,让我走上了正确的道路。

从一个网站上,你可以做:

var id = query["ProductID"];
可以使用将其转换为整数

int id = 0;
if (!string.IsNullOrEmpty(query["ProductID"]) && 
  int.TryParse(query["ProductID"], out id))  {
  // use id here..
}

你能用正则表达式来解析它吗

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;
string uri=“website.com/stuff/?refererpage=1&productID=1234567&tab=Tile”;
var rgx=new Regex(“productID=(?[0-9]+)”,RegexOptions.IgnoreCase);
字符串pid=rgx.Match(uri).Groups[1]。值;
编辑:按照建议提供上下文,我应该这样做:

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

只需获取productID

用户访问的最后一页

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

你问题中的方法是:

  • 获取Uri(一个
    字符串
    变量)
  • 将其传递给UriBuilder
    UriBuilder
    在其构造函数中初始化一个
    Uri
    ,它本身通过创建更多字符串等方式进行大量工作来验证Uri、填充属性等
  • 然后,从生成的
    Uri
    对象中,使用
    Query
    属性-这是
    Uri
    分配的新字符串之一
  • 将其传递给
    HttpUtility.ParseQueryString
    。这将创建一个
    HttpValueCollection
    ,它本身在传入的字符串上逐字符迭代,以解析查询字符串中的键值对,并将它们粘贴到NameValueCollection中,最终将您的值存储在.NET中效率最低的一个-集合中(请参阅各种参考资料,包括这篇-)因为它将所有内容存储在一个对象数组中,需要在每次取出内容时进行强制转换
  • 最后,您可以通过一个键搜索该集合,以获取您的产品id
这需要大量的字符串和字符分配,与对象之间的转换,将内容放入索引数组中,然后进行扫描,等等。只是为了得到:

  • 一种字符串,可通过模式从另一个字符串中识别
虽然我承认内存很便宜,但似乎有一个同样好或更好的替代方法。这就是regex的用途——在字符串中找到一个模式,并允许您将该模式的一部分取回

因此,您的选择:

  • 如果您只想以精确的形式从uri中获取productID,并且uri最初是一个字符串,那么我认为正则表达式是一个非常好的、有效的选择。如果您想从uri中提取其他模式,这也会起作用
  • 如果要知道查询字符串中的所有键以及特定键的值,请使用
    HttpUtility.ParseQueryString
    方法;
    NameValueCollection
    允许您通过
    AllKeys
    属性访问键
  • 如果您想为当前请求的uri获取查询字符串参数的值,那么Marcianin的答案是最简单的选择,您可以忽略前两个选项
  • 在所有情况下,获得字符串后,可以使用int上的解析方法对其进行解析,但如果使用2.或3.则提取的id可能不是数字(在恶意请求的情况下)因此,请确保使用
    int.TryParse
    not
    int.Parse
    从字符串转换,并小心捕获异常。从查询字符串中获取输入时应始终小心,以免与查询字符串中的恶意数据相冲突(一旦您的网站联机,这些数据将频繁出现)。

    选择取决于个人偏好

    • 您编写的实际代码大致相同——每种方法占用很少的行
    • 代码永远不应该过早地优化,但如果它能帮助优化,也不应该故意浪费。您可以对其中一个进行性能测试,但在这个阶段这将是浪费时间
    • 然而,代码也应该传达意图。即使我会争辩说,正则表达式方法也不像ParseQueryString方法那样传达您的意图
    脚注:我会将正则表达式稍微更改为
    “[?&]productID=(?[0-9]+)”
    ,以确保只选择“productID”而不选择“foodroductid”

    最重要的是,你问

    我的代码正确吗

    我会说你是。在你继续进行的过程中,总是权衡不同的选择。不要害怕尝试不同的东西。你说你是C#新手。在这种情况下,你可能错过了一件事,那就是在编写代码之前编写一个测试来帮助你:如果测试通过,代码是正确的,你选择的方法是次要的如果你使用的是最新版本,VisualStudio会让你的测试变得容易。如果你在早期养成良好的习惯,它将在你以后的职业生涯中为你带来回报

    如何将productID号放入somet中
    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 }
    }