2013-05-10 45 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