我尝试做的是使用UriBuilder和HttpUtility.ParseQueryString来获取用户访问的最后一个页面,然后解析URL以仅获取productID。(如果重要的话,每个页面上的产品ID都不同)
示例网址: website.com/stuff/?referrerPage=1&productID=1234567&tab=Tile
我想要的只是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是我获取上次访问的网址的地方:
public grabUrl(string Uri)
{
UriBuilder uriBuilder = new UriBuilder(Request.UrlReferrer);
return uriBuilder.Uri;
}
我的代码在正确的轨道上吗?如何将productID编号放入某物中,以便使用它?一般来说,我对c#和这种类型的编码非常陌生。当我说新的时候,我的意思是我已经做了大约一个星期了。因此,任何详细的解释或示例都将非常有用。感谢大家的帮助,我从这个网站学到了很多东西,让我走上了正确的道路。
发布于 2013-05-10 22:53:13
然后,您可以从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-10 23:59:34
或者,您可以使用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-10 22:53:17
您可以使用正则表达式来解析它吗?
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。
你问题中的方法是这样做的:
string
将其初始化为UriBuilder
;UriBuilder
在其构造函数中初始化Uri
,它本身会做大量的工作来验证uri,填充属性等)。通过创建更多的字符串,然后,从生成的代码对象中,您现在可以使用<>D19>属性-这是< Uri
>D20Uri>具有allocated
HttpValueCollection
,它会逐个字符地迭代您传入的字符串以解析出查询字符串中的键值对,并将它们粘贴到一个NameValueCollection中,它最终将您的值存储在一个ArrayList
中-这是.NET中效率最低的集合之一(请参阅各种引用,包括这个- What's Wrong with an ArrayList?),因为它将所有内容存储在一个对象数组中,每次您取回数据时都需要强制转换。这是一大堆字符串和字符分配,来回转换对象,将对象放入索引数组,然后扫描,等等,只是为了获得:
虽然我承认内存很便宜,但似乎还有一种同样好或更好的替代方案。这就是正则表达式的用途-在字符串中找到一个模式,并允许您将该模式的一部分提取出来。
所以,你的选择是:
HttpUtility.ParseQueryString
方法;NameValueCollection
允许您通过AllKeys
属性访问这些键。在所有情况下,一旦您有了字符串,您就可以使用int上的解析方法来解析它,但是如果您使用2.或3.您提取的id可能不是数字(在恶意请求的情况下),因此请确保使用int.TryParse
而不是int.Parse
从字符串转换,并注意捕获异常。您在从查询字符串中获取输入时应始终小心,以免与查询字符串中的恶意数据发生冲突(一旦您的网站联机,恶意数据就会频繁地攻击您的网站)。
选择是个人喜好。
脚注:我会将正则表达式稍微更改为"[?&]productID=(?<pid>[0-9]+)"
,以确保您只选择"productID“,而不选择"fooProductID”。
最重要的是,你问我
我的代码在正确的轨道上吗?
我会说你是。当你继续的时候,一定要权衡不同的选项。不要害怕尝试不同的东西。你说你是C#的新手。在这种情况下,您可能遗漏了一件事,那就是在编写代码之前编写一个测试来帮助您:如果测试通过,则代码是正确的,而您选择的方法是次要的。如果您使用的是最新版本,Visual Studio将使您的测试变得更容易。如果你在早期养成了良好的习惯,这将在以后的C#职业生涯中带来好处。
如何将productID编号放入某物中,以便使用它?
Grant Thomas完美地回答了这个问题-- int.TryParse将字符串转换为数字。
https://stackoverflow.com/questions/16485041
复制相似问题