2013-05-10 58 views
3

我想要做的是使用UriBuilder和HttpUtility.ParseQueryString来获取用户访问的最后一页,然后解析URL以获取productID。 (产品ID是每个页面上的不同,如果该事项)如何使用UriBuilder和HttpUtility.ParseQueryString来存储URL并解析它

例如网址:website.com/stuff/?referrerPage=1 & =的productID 1234567 &标签=瓷砖

和我想要的仅仅是1234567

的Page_Load是我解析的网址:

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#和这种类型的编码都很陌生......当我说新的时,我的意思是我已经做了大约一周的时间。所以任何详细的解释或例子都会非常受欢迎。感谢大家的帮助,我从这个网站学到很多东西,让我走上正轨。

+0

我真的不知道这意味着什么@Grant,你能解释一下吗?谢谢。 – JavaTheScript 2013-05-10 15:46:56

+0

@JavaTheScript。我想格兰特问你为什么把'Uri'字符串放入'Page_Load'中。通常'Page_Load'看起来像这样:'protected void Page_Load(object sender,EventArgs e)'。 – 2013-05-10 19:30:16

+0

@JavaTheScript。此外,值得了解[IsPostBack](http://msdn.microsoft.com/zh-cn/library/system.web.ui.page.ispostback.aspx)属性,以便您可以决定在Page_Load中进行工作在第一次加载时,或在回发,但不是两个。 – 2013-05-10 19:31:51

回答

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.. 
} 
+0

如果我知道ProductID将永远是一个整数是否有一点使用int.TryParse?或者我应该离开它,只是抛出var id = query [“ProductID”];在NameValueCollection下? – JavaTheScript 2013-05-13 14:41:19

+0

@JavaTheScript你确定吗? – 2013-05-13 16:13:15

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在其构造函数中初始化了一个Uri,它本身做了大量的工作来验证uri,填充属性等。通过创建多个字符串,除其他事项外
  • 然后,从产生的Uri对象,你现在用Query物业工作 - 这是Uri已分配
  • 新的字符串中的一个通行证,为HttpUtility.ParseQueryString。这会创建一个HttpValueCollection,它本身会逐字符遍历您传入的字符串以解析出查询字符串中的键值对,并将它们粘贴到NameValueCollection中,最终将值存储在ArrayList中 - 其中一个.NET中效率最低的集合(请参阅各种参考资料,包括这一个 - What's Wrong with an ArrayList?),因为它将所有内容存储在对象数组中,每次将事情退出时都需要进行投射。
  • 最后,您可以使用密钥搜索该集合,以将您的产品ID退出。

这一大堆的字符串和字符分配,铸造和对象,将东西放入索引的数组,你再扫描等刚刚拿到:

  • 一个这是由模式可识别字符串

虽然我承认记忆很便宜,但似乎可能有同样好的或更好的选择。这就是正则表达式的原因 - 在一个字符串中找到一个模式,并允许您将该模式的一部分返回。

所以,你的选择:

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

在任何情况下,一旦拥有字符串,您可以使用int上的解析方法解析它,但是如果使用2或3.您提取的ID可能不是数字(在恶意请求),所以请确保使用int.TryParse而不是int.Parse从字符串转换,并小心捕获异常。 从查询字符串中输入内容时,请务必小心,以免在查询字符串中产生恶意数据(这会在您的网站上线后频繁出现)。

选择是个人喜好。

  • 您编写的实际代码大致相同 - 每种方法占用的行数很少。代码不应该过早地优化,但是它也不应该是故意浪费的,如果它可以提供帮助的话。你可以针对另一个人进行性能测试,但这会浪费你在这个阶段的时间。
  • 但是,代码也应该表达意图。即使我会争辩说,正则表达式的方法并没有传达你的意图以及ParseQueryString方法。

脚注:我的正则表达式会稍有改变,以"[?&]productID=(?<pid>[0-9]+)",以确保你拿起唯一的“的productID”,而不是“fooProductID”

最重要的是,你问

我是在右边跟踪我的代码?

我会说你是。随着您的进行,总是要权衡不同的选项。不要害怕尝试不同的东西。你说你是C#的新手。在这种情况下,您可能错过了一件事情,那就是在编写代码之前编写测试以帮助您:如果测试通过,代码是正确的,您选择的方法是次要的。如果您使用的是最新版本,Visual Studio可以让您轻松地进行测试。如果你很早就习惯了良好的习惯,那么你将在C#职业生涯中获得回报。

如何将productID编号放在某个东西中,以便我可以使用它?

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

+0

有兴趣知道为什么downvote - 所以我可以学习未来的答案。 – 2013-05-10 14:57:36

+1

正则表达式,这个不好的主意,并且关于它是所有人都想到的。 – 2013-05-10 18:22:54

+0

@GrantThomas。谢谢,你确定吗?确切的场景是“从用户访问的最后一页获取产品ID”。 UriBuilder - > HttpUtility.ParseQueryString为键 - >字符串执行字符串 - >对象 - >字典 - >值检索。正则表达式的字符串 - >字符串。这不是更简洁有效吗? – 2013-05-10 18:32:40

1

或者您也可以向您的URL中使用的Request.QueryString查询字符串值()

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 } 
} 
+0

是的它总是会是一个整数。所以我不必使用NameValueCollection?我只是使用这段代码,并在做一些写代码来只调用ProductID中的7个数字? – JavaTheScript 2013-05-10 17:22:31

+0

非常多,这是在我看来解决您的解决方案的最简单的方法。在IF语句中,您必须使用_prodID。你打算如何使用这个变量?你打算在SQL语句中输入它吗? – Marcianin 2013-05-10 17:55:07

+0

我只使用NameValueCollection,当我不知道在Querystring上发送的参数的名称,例如当用户填充窗体上的一些文本框,有些留空时,我只发送具有值和NameValueCollection的那些我得到的参数和价值观,但如果你现在正在寻找的参数的名称只是请求它直接 – Marcianin 2013-05-10 17:58:51