2011-10-03 13 views
5

Ho una web part personalizzata C# su una pagina di SharePoint 2007. Quando si fa clic su un collegamento in un report SSRS in un'altra pagina, invia l'utente alla mia pagina webpart personalizzato con una stringa di query come la seguente:Come analizzare una stringa di query con "&" nel valore utilizzando C#?

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

Prendere nota del valore per "tax4Elem", che è fondamentalmente "Caricabatterie &". (La e commerciale può effettivamente apparire in "tax4Elem", "tax3Elem" e "tax5Elem").

Non posso avere la e commerciale con quel valore codificato, quindi dovrò lavorare con questo.

Come analizzare questa stringa di query in modo che non riconosca "&" in "Caricabatterie &" come inizio di una coppia chiave/valore?

Grazie in anticipo! kate

+3

Ok, quindi sembra che l'url sia codificato in modo improprio ... Posso provare a rintracciare chi potrebbe essere in grado di correggere questo problema nel rapporto SSRS per mostrare invece un% 26. Grazie mille per il tuo tempo! – KateF

+0

Alla fine, ho usato uno strumento che mi ha aiutato a creare l'espressione reg e ora ha il seguente aspetto: "Regex.Split (qstr, @" (? <= \ W) & (? = \ W) ")" e poi ho dovuto dividerlo di nuovo sul "=" per ottenere le mie coppie chiave/val. – KateF

risposta

1

Se davvero non riesci a correggere l'URL, puoi comunque provare ad analizzarlo, ma devi prendere delle decisioni. Ad esempio:

  • Le chiavi possono contenere solo caratteri alfanumerici.
  • Non ci sono valori vuoti o, almeno, c'è sempre un segno di uguale = dopo il tasto
  • I valori possono contenere ulteriori e commerciali e punti interrogativi.
  • valori possono contenere ulteriori segni uguali, purché non sembrano essere parte di una nuova coppia chiave/valore (non sono preceduti da &\w+)

Un possibile modo per catturare queste coppie fa :

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); 

si può quindi ottenere i valori:

string tax4 = values["tax4Elem"]; 

Nota che se la stringa di query è "valido" secondo la nostra regola, il patt ern potrebbe non acquisire tutti i valori.

+0

WOW ... è fantastico ... lo proverò adesso. Grazie! – KateF

+0

Questo sembra utilizzare le annotazioni LinQ, che non stiamo usando ... qual è il processo per fare la stessa cosa senza LinQ? – KateF

+0

@KateF - ​​L'unico LINQ qui è il metodo di estensione 'ToDictionary'. Puoi scorrere le partite e aggiungerle a un dizionario oa una raccolta di chiavi/valori - non c'è magia qui ... (a proposito, questo è .net 3.5, che è supportato da SharePoint 2007. – Kobi

-1

Oppure è possibile utilizzare HttpServerUtility.HtmlDecode metodo per decodificare il valore su '&' (e commerciale) firmare

+0

Inizialmente non è codificato nella stringa, che non è valido e causa il problema originale. –

+0

vedo, il mio male non ho notato il & firm! – Waqas

+0

Penso che intendessi HttpServerUtility.HtmlEncode (non sono riuscito a trovare alcun "HtmlDecode"), ma come utilizzerei questo senza codificare le e commerciali commerciali correttamente utilizzate che indicano la prossima coppia chiave/valore? – KateF

1

Penso che non si può analizzare la stringa correttamente - è stato codificato in modo non corretto. La e commerciale in "Docks & Chargers" avrebbe dovuto essere codificato come %26 invece di &:

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

E 'possibile modificare il codice che ha generato l'URL?

+0

Purtroppo non riesco a codificarlo ... il valore proviene da un db esterno e viene risucchiato in un rapporto SSRS (di cui non ho il controllo). Quindi sarei soggetto a dover analizzare questa stringa con una semplice manipolazione delle stringhe? – KateF

1

Ovviamente la richiesta non è corretta. Tuttavia, per aggirare il problema, puoi utilizzare l'URL originale, quindi trovare l'indice di &ss=. Quindi, trova immediatamente il segno =. Decodifica (con UrlDecode) quindi reencode (con UrlEncode) la parte tra = e &ss= (il valore di tax4Elem). Poi, ricostruire la stringa di query simile:

correctQueryString = "?tax4Elem=" + reencodedTaxValue + remainderOfQueryString 

e decodificare normalmente (per esempio con ParseQueryString) in un NameValueCollection.

+0

Probabilmente questo potrebbe funzionare, ma tax3Elem e tax5Elem potrebbero anche avere lo stesso problema con e commerciali all'interno del loro valore – KateF

+0

@Kate, se tutti potrebbero essere errati, allora devi fare questo processo in modo iterativo. A quel punto, vorrei solo scrivere un parser personalizzato senza provare a usare 'ParseQueryString'. –

+0

eek ... pensavo che ci sarebbe stata una bella frase regex per tirarlo fuori. ho provato, ma regex non è mai stato il mio punto di forza. :-/ grazie. – KateF

Problemi correlati