Niekedy je potrebné zakódovať parametre do URL, ktoré budú odoslané na server (napr. cez HttpWebRequest.GetResponse()). V .NETe môžeme použiť klasickú metódu z ASP HttpServerUtility.UrlEncode() na zakódovanie jednotlivých parametrov. Existuje však oveľa lepší spôsob, ako kódovať parametre. Vďaka objektovému modelu sa nám naskytne veľmi elegantné riešenie.
Triedu UrlParameterWriter si rozšírime tak, aby sme mali prístup k jej chránenej (protected) metóde Encode(TextWriter, string, object). Táto do výstupného bufferu vloží zakódovaný názov parametru a jeho hodnotu, pričom sama podľa potreby pridáva oddeľovacie znaky ako = a &.
Naša trieda teda bude dediť
namespace izsaknet.VisualStudio.FogBugz.Tools{ public class UrlParameterEncoder : UrlParameterWriter { public UrlParameterEncoder() : base () { } public void Encode(TextWriter writer, string name, string value) { base.Encode(writer, name, value); } }}
URL parametre je dobré si uchovávať v NameValueCollection, ktorá uchováva páry kľúč/hodnota (typu string). Na celé zloženie URL použijeme objekt UriBuilder.
UriBuilder uri = new UriBuilder(„http://www.izsak.net/search“);NameValueCollection values = new NameValueCollection(2);values.Add(„search“, searchTerm);values.Add(„section“, „all“);StringBuilder query = new StringBuilder();TextWriter writer = new StringWriter(query);UrlParameterEncoder encoder = new UrlParameterEncoder();foreach (string key in values){ encoder.Encode(writer, key, values[key]);}uri.Query = query.ToString();
Kód asi nepotrebuje veľa vysvetľovania, vytvoríme nový objekt so základnou URL adresou na nejaký dokument. Potom si naplníme pole hodnotami. Za zmienku stojí vytvorenie textového bufferu a writeru. Metóda Encode() bude zapisovať parametre do TextWriteru a ten do bufferu textu. Spojené parametre zo StringBuilder-u vložíme do UriBuilder cez jeho Query vlastnosť.
Niektoré veci v .NETe si vyžadujú viacej úsilia, ako len inštancovanie triedy a jej použitie. Treba trošku použiť hlavu a derivovať triedy . Toto celé sa dá pekne zaobaliť do triedy ktorá by reprezentovala webový formulár a uchovávala si hodnoty pre GET a POST v dvoch kolekciách a používali by takúto serializáciu parametrov. Pri POST ešte treba výsledný string skonvertovať na pole bajtov (byte[]) napr. pomocou Encoding.ASCII.GetBytes(string).