C# 如何使用UriBuilder和HttpUtility.ParseQueryString存储URL并对其进行解析
我试图做的是使用UriBuilder和HttpUtility.ParseQueryString获取用户访问的最后一个页面,然后解析URL以仅获取productID。(如有必要,每一页上的产品ID是不同的) 示例URL:website.com/stuff/?refererpage=1&productID=1234567&tab=Tile 我想要的只是1234567 页面加载是我解析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
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
,它本身在传入的字符串上逐字符迭代,以解析查询字符串中的键值对,并将它们粘贴到NameValueCollection中,最终将您的值存储在.NET中效率最低的一个-集合中(请参阅各种参考资料,包括这篇-)因为它将所有内容存储在一个对象数组中,需要在每次取出内容时进行强制转换HttpValueCollection
- 最后,您可以通过一个键搜索该集合,以获取您的产品id
- 一种字符串,可通过模式从另一个字符串中识别
HttpUtility.ParseQueryString
方法;NameValueCollection
允许您通过AllKeys
属性访问键int.TryParse
notint.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 }
}