首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用UriBuilder和HttpUtility.ParseQueryString来存储和解析URL

如何使用UriBuilder和HttpUtility.ParseQueryString来存储和解析URL
EN

Stack Overflow用户
提问于 2013-05-10 22:50:34
回答 3查看 5.3K关注 0票数 3

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

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

我想要的只是1234567

Page_Load是我解析网址的地方:

代码语言:javascript
运行
复制
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是我获取上次访问的网址的地方:

代码语言:javascript
运行
复制
public grabUrl(string Uri) 
{ 
    UriBuilder uriBuilder = new UriBuilder(Request.UrlReferrer); 
    return uriBuilder.Uri; 
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-10 22:53:13

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

代码语言:javascript
运行
复制
var id = query["ProductID"];

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

代码语言:javascript
运行
复制
int id = 0;
if (!string.IsNullOrEmpty(query["ProductID"]) && 
  int.TryParse(query["ProductID"], out id))  {
  // use id here..
}
票数 2
EN

Stack Overflow用户

发布于 2013-05-10 23:59:34

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

代码语言:javascript
运行
复制
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 }
}
票数 1
EN

Stack Overflow用户

发布于 2013-05-10 22:53:17

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

代码语言:javascript
运行
复制
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,但您最初的问题非常具体:

只获取productID

从…

用户访问的最后一个页面

(我认为它不是当前请求的uri )。此外,您还提供了以字符串格式提供的Uri。

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

  • 使用Uri ( string将其初始化为UriBuilderUriBuilder在其构造函数中初始化Uri,它本身会做大量的工作来验证uri,填充属性等)。通过创建更多的字符串,然后,从生成的代码对象中,您现在可以使用<

>D19>属性-这是< Uri >D20Uri>具有allocated

  • Passes to <代码>D23>的新字符串之一。这将创建一个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上的解析方法来解析它,但是如果您使用2.或3.您提取的id可能不是数字(在恶意请求的情况下),因此请确保使用int.TryParse而不是int.Parse从字符串转换,并注意捕获异常。您在从查询字符串中获取输入时应始终小心,以免与查询字符串中的恶意数据发生冲突(一旦您的网站联机,恶意数据就会频繁地攻击您的网站)。

选择是个人喜好。

  • 您实际编写的代码大致相同--每种方法只占很少的几行代码。
  • 代码永远不应该过早优化,但如果可以帮助它,它也不应该故意浪费。您可以对其中一个进行性能测试,但这将浪费您的时间,因为stage.
  • However,代码也应该传达意图。即使我认为,正则表达式方法并没有像ParseQueryString方法那样传达您的意图。

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

最重要的是,你问我

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

我会说你是。当你继续的时候,一定要权衡不同的选项。不要害怕尝试不同的东西。你说你是C#的新手。在这种情况下,您可能遗漏了一件事,那就是在编写代码之前编写一个测试来帮助您:如果测试通过,则代码是正确的,而您选择的方法是次要的。如果您使用的是最新版本,Visual Studio将使您的测试变得更容易。如果你在早期养成了良好的习惯,这将在以后的C#职业生涯中带来好处。

如何将productID编号放入某物中,以便使用它?

Grant Thomas完美地回答了这个问题-- int.TryParse将字符串转换为数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16485041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档