2011-10-03 25 views
5

Tôi có một webpart tùy chỉnh C# trên trang sharepoint 2007. Khi nhấp vào một liên kết trong một báo cáo SSRS trên một trang khác, nó sẽ gửi người dùng đến trang webpart tuỳ chỉnh của tôi với một chuỗi truy vấn như sau:Làm cách nào để phân tích cú pháp chuỗi truy vấn bằng "&" trong giá trị bằng C#?

?tax4Elem=Docks%20&%20Chargers&ss=EU%20MOVEX&Phase=1&tax3Elem=Play%20IT&tax5Elem=Charger 

Hãy lưu ý giá trị cho "tax4Elem", đó là cơ bản "Docks & Bộ sạc". (Dấu và thực sự có thể xuất hiện trong "tax4Elem", "tax3Elem" và "tax5Elem").

Tôi không thể có ký hiệu và giá trị được mã hóa để tôi sẽ phải làm việc với điều này.

Làm cách nào để phân tích chuỗi truy vấn này để nó không nhận ra "&" trong "Docks & Bộ sạc" làm khởi đầu của cặp khóa/giá trị?

Cảm ơn bạn đã nâng cao! kate

+3

Ok, vì vậy có vẻ như url được mã hóa không chính xác ... Tôi có thể cố gắng theo dõi những người có thể sửa lỗi này và sự cố trong báo cáo SSRS để hiển thị% 26 thay thế. Cảm ơn bạn rất nhiều vì thời gian của bạn! – KateF

+0

Cuối cùng, tôi đã sử dụng một công cụ giúp tôi tạo biểu thức reg và bây giờ trông giống như sau: 'Regex.Split (qstr, @ "(? <= \ W) & (? = \ W)")' và sau đó tôi đã phải chia nó một lần nữa trên "=" để có được cặp chìa khóa/val của tôi. – KateF

Trả lời

1

Nếu bạn thực sự không thể sửa URL, bạn vẫn có thể thử phân tích cú pháp, nhưng bạn phải đưa ra một số quyết định. Ví dụ:

  • Phím chỉ có thể chứa ký tự chữ và số.
  • Không có giá trị trống hoặc ít nhất, luôn có dấu bằng = sau khóa
  • Giá trị có thể chứa dấu và dấu hỏi bổ sung.
  • Giá trị có thể chứa dấu bằng bổ sung, miễn là họ không xuất hiện là một phần của một cặp khóa/giá trị mới (họ không bắt đầu bằng &\w+)

Một cách tốt để nắm bắt những cặp là :

MatchCollection matches = Regex.Matches(s, @"\G[?&](?<Key>\w+)=(?<Value>.*?(?=$|&\w+=))"); 
var values = matches.Cast<Match>() 
        .ToDictionary(m => m.Groups["Key"].Value, 
            m => HttpUtility.UrlDecode(m.Groups["Value"].Value), 
            StringComparer.OrdinalIgnoreCase); 

sau đó, bạn có thể nhận được các giá trị:

string tax4 = values["tax4Elem"]; 

Lưu ý rằng nếu chuỗi truy vấn là "không hợp lệ" theo quy tắc của chúng tôi, Patt ern có thể không nắm bắt tất cả các giá trị.

+0

WOW ... thật tuyệt vời ... Tôi sẽ thử điều đó ngay bây giờ. Cảm ơn bạn! – KateF

+0

Điều này dường như đang sử dụng chú thích LINQ, mà chúng tôi không sử dụng ... quy trình để làm điều tương tự mà không có LinQ là gì? – KateF

+0

@KateF - ​​LINQ duy nhất ở đây là phương thức mở rộng 'ToDictionary'. Bạn có thể lặp qua các trận đấu và thêm chúng vào một từ điển hoặc một bộ sưu tập khóa/giá trị - không có phép thuật ở đây ... (bằng cách này, đây là .net 3.5, được hỗ trợ bởi SharePoint 2007. – Kobi

-1

Hoặc bạn có thể sử dụng HttpServerUtility.HtmlDecode phương pháp để giải mã các giá trị cho '&' (và) ký

+0

Nó không được mã hóa trong chuỗi để bắt đầu, không hợp lệ và gây ra vấn đề ban đầu. –

+0

tôi thấy, tôi không nhận thấy thông báo & dấu! – Waqas

+0

Tôi nghĩ rằng bạn có nghĩa là HttpServerUtility.HtmlEncode (Tôi không thể tìm thấy bất kỳ "HtmlDecode"), nhưng làm thế nào tôi sẽ sử dụng này mà không mã hóa các ký hiệu được sử dụng một cách chính xác mà chỉ ra cặp khóa/giá trị tiếp theo? – KateF

1

Tôi nghĩ rằng bạn không thể phân tích chuỗi một cách chính xác - nó đã được mã hóa không đúng cách. Các dấu trong "Docks & sạc" nên đã được mã hóa như %26 thay vì &:

?tax4Elem=Docks%20%26%20Chargers&ss=EU%20MOVEX&Phase=1&tax3Elem=Play%20IT&tax5Elem=Charger

Có thể thay đổi mã đã tạo ra URL?

+0

Rất tiếc, tôi không thể mã hóa nó ... giá trị đến từ một db bên ngoài và được hút vào báo cáo SSRS (mà tôi không kiểm soát được). Vì vậy, tôi sẽ phải phân tích chuỗi này bằng thao tác chuỗi cơ bản? – KateF

1

Rõ ràng yêu cầu không chính xác. Tuy nhiên, để giải quyết vấn đề này, bạn có thể lấy URL gốc, sau đó tìm IndexOf của &ss=. Sau đó, tìm ký hiệu = ngay trước đó. Giải mã (với UrlDecode) sau đó reencode (với UrlEncode) phần giữa =&ss= (giá trị của tax4Elem). Sau đó, tái tạo lại chuỗi truy vấn như thế này:

correctQueryString = "?tax4Elem=" + reencodedTaxValue + remainderOfQueryString 

và giải mã nó bình thường (ví dụ: với ParseQueryString) vào một NameValueCollection.

+0

Điều đó có thể làm việc, nhưng sau đó tax3Elem và tax5Elem cũng có thể có cùng một vấn đề với dấu và trong giá trị của chúng – KateF

+0

@Kate, nếu tất cả chúng có thể sai, thì bạn phải thực hiện quá trình này lặp đi lặp lại. Tại thời điểm đó, tôi sẽ chỉ viết một trình phân tích cú pháp tùy chỉnh mà không cố sử dụng 'ParseQueryString'. –

+0

eek ... tôi nghĩ rằng sẽ có một số điều regex mát mẻ để whip này ra. tôi đã thử, nhưng regex không bao giờ là điểm mạnh của tôi. :-/ cảm ơn bạn. – KateF

Các vấn đề liên quan