2011-10-03 10 views
5

SharePoint 2007のページにC#カスタムWebパーツがあります。基本的には「tax4Elem」、の値のC#を使用して値に "&"を含むクエリ文字列を解析するにはどうすればよいですか?

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

をメモ:別のページでSSRSレポート内のリンクをクリックすると、それは次のようなクエリ文字列と私のカスタムWebパーツページにユーザーを送ります"ドック&充電器"。 (アンパサンドは実際に "tax4Elem"、 "tax3Elem"、 "tax5Elem"に現れることがあります)。

エンコードされた値でアンパサンドを使用することはできません。そのため、私はこれを処理する必要があります。

キーと値のペアの先頭に「Dock & Chargers」の「&」が認識されないように、このクエリ文字列を解析するにはどうすればよいですか?

ありがとうございました! ケイト

+3

URLが不適切にエンコードされているようです... SSRSレポートでこの問題を修正できる人を追跡して、代わりに%26が表示されるようにすることができます。あなたのお時間をありがとうございました! – KateF

+0

最後に、私はreg式を作成するのに役立つツールを使用しました。これは次のようになります: 'Regex.Split(qstr、@ "(?<= \ w)&(?= \ w)")'私はキー/ valのペアを取得するために "="で再び分割しなければなりませんでした。 – KateF

答えて

1

本当にURLを訂正できない場合でも、解析することはできますが、いくつかの決定をする必要があります。例:

  • キーには英数字を使用できます。
  • キーの後に空の値がないか、少なくとも常に等号があります
  • 値にはアンパサンドと疑問符が追加されることがあります。
  • 値は、これらのペアをキャプチャする1つの可能な方法がある

(それらは&\w+に先行されていない)限り、彼らは新しいキー/値ペアの一部であるように思われないよう、追加の等号が含まれていてもよいです:クエリ文字列は、私たちのルールに従って「無効」である場合という

string tax4 = values["tax4Elem"]; 

注意、PATT:

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

その後、値を取得することができますernはすべての値を取得しないことがあります。

+0

うわー...それは素晴らしいです...私は今すぐそれを試してみましょう。ありがとうございました! – KateF

+0

これは、私たちが使用していないLinQ注釈を使用しているようです... LinQなしで同じことをするプロセスは何ですか? – KateF

+0

@KateF - ここで唯一のLINQは 'ToDictionary'拡張メソッドです。マッチをループして、辞書やキー/値のコレクションに追加することができます。マジックはありません。(ちなみに、これはSharePoint 2007でサポートされている.net 3.5です。 – Kobi

-1

それとも、私はあなたが正しく、その文字列を解析することができないと思います「&」(アンパサンド)記号

+0

文字列にはエンコードされていませんが、無効で元の問題が発生します。 –

+0

私は見て、私の悪い私は&印を気づかなかった! – Waqas

+0

私はあなたがHttpServerUtility.HtmlEncode( "HtmlDecode"を見つけることができませんでした)を意味すると思っていますが、次のキー/値のペアを示す正しいアンパサンドをエンコードせずにどのように使用しますか? – KateF

1

に値をデコードするHttpServerUtility.HtmlDecodeメソッドを使用することができます - それは間違ってエンコードされています。 「ドック&チャージャー」のアンパサンドが%26代わりの&として符号化されている必要があります。

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

それはURLを生成したコードを変更することは可能ですか?

+0

私は残念ながらそれをエンコードできません...値は外部のデータベースから来て、SSRSレポートに吸い込まれます(私は制御できません)。だから私は基本的な文字列操作でこの文字列を解析する必要がありますか? – KateF

1

明らかにリクエストが間違っています。しかし、これを回避するには、元のURLを取得し、次にIndexOfが&ss=であることがわかります。その直前に=記号が見つかります。デコード(UrlDecode)、=&ss=(tax4Elemの値)の間の部分を再エンコード(UrlEncode)します。 NameValueCollection

correctQueryString = "?tax4Elem=" + reencodedTaxValue + remainderOfQueryString 

と(例えばParseQueryStringで)、通常、それを復号化:次に、このようなクエリ文字列を再構成します。

+0

これはおそらくうまくいくかもしれませんが、tax3Elemとtax5Elemはアンダーザントの値が – KateF

+0

@Kateの中で同じ問題を抱えている可能性があります。すべてが間違っている場合は、このプロセスを繰り返し実行する必要があります。その時点で、 'ParseQueryString'を使わずにカスタムパーサを書くだけです。 –

+0

eek ...私はこれを払拭するいくつかのクールな正規表現のものがあると思った。私は試みたが、正規表現は私の強みではなかった。 :-/ ありがとうございました。 – KateF

関連する問題