C# ASP.Net Deserialisatie van een parameterstring

Pagina: 1
Acties:

Onderwerpen


  • SideShow
  • Registratie: Maart 2004
  • Laatst online: 16-06 15:55

SideShow

Administrator

Topicstarter
Hallo

Ik ben op zoek naar een (bestaande) manier om een parameterstring om te zetten in een bestaand object.
Het gaat over een string in deze vorm:
param1=value1&param2=value2&...

De klasse bestaat al ... en ik zou natuurlijk de string manueel kunnen parsen/constructen/reflection doen.... maar vraag me af als hier geen ingebouwde of betere manier voor te vinden is. Iets ingebouwd in .Net die handig van pas komt?

Even de context schetsen:

- een zoekpagina waar je door middel van facets kunt ... welja zoeken :+
- vanuit de zoekpagina kan je detailpagina openen: in deze pagina kan je tussen artikels browsen door middel van een vorige en volgende knop
- deze vorige/volgende knop moet navigeren in dezelfde resultatenpool zoals dit in het zoekscherm het geval was

It just happes to be .. alle zoekparameters op de zoekpagina komen automatisch als een paramstring in de cookie terecht en komen zo in de http request headers van een detail pagina.

Zo zat ik te denken om gewoon de cookie te gebruiken om dezefde navigatie-semantiek te hebben in je detail.

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Deserializeren / parsen doe je via de HttpUtility.ParseQueryString static method.

De omgekeerde operatie, het serializeren, is trouwens zo te doen:

C#:
1
2
3
4
5
6
7
8
function SerializeQueryString(IDictionary<string,string> dict)
{
  NameValueCollection temp = HttpUtility.ParseQueryString(string.Empty);
  foreach( var pair in dict ) {
    temp.Add( pair.Key, pair.Value );
  }
  return "?" + temp.ToString();
}


ParseQueryString geeft eigenlijk geen NameValueCollection terug, maar een instantie van de interne HttpValueCollection class (die van de NameValueCollection class afgeleid is). De ToString method van de HttpValueCollection class serialiseert de collectie als een valide query string en neemt daarbij ook zaken als het correct encoden van de componenten van de query string voor zijn rekening.

Moet je ook maar net weten. :)

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
R4gnax schreef op donderdag 23 februari 2012 @ 23:15:
Deserializeren / parsen doe je via de HttpUtility.ParseQueryString static method.

De omgekeerde operatie, het serializeren, is trouwens zo te doen:

C#:
1
2
3
4
5
6
7
8
function SerializeQueryString(IDictionary<string,string> dict)
{
  NameValueCollection temp = HttpUtility.ParseQueryString(string.Empty);
  foreach( var pair in dict ) {
    temp.Add( pair.Key, pair.Value );
  }
  return "?" + temp.ToString();
}


ParseQueryString geeft eigenlijk geen NameValueCollection terug, maar een instantie van de interne HttpValueCollection class (die van de NameValueCollection class afgeleid is). De ToString method van de HttpValueCollection class serialiseert de collectie als een valide query string en neemt daarbij ook zaken als het correct encoden van de componenten van de query string voor zijn rekening.

Moet je ook maar net weten. :)
Deserializen, eens. Serializen, niet mee eens. De klasse HttpValueCollection is geen onderdeel van de publieke .NET bibliotheek. Het is dus niet verstandig om die klasse te gebruiken.

Wat is er mis met zelf een methode maken, is nog minder code ook?
C#:
1
2
3
4
public static string SerializeQueryString(IDictionary<string, string> dict)
{
    return "?" + string.Join("&", dict.Select(v => HttpUtility.UrlEncode(v.Key) + "=" + HttpUtility.UrlEncode(v.Value)));
}

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Face_-_LeSS schreef op donderdag 23 februari 2012 @ 23:38:

Deserializen, eens. Serializen, niet mee eens. De klasse HttpValueCollection is geen onderdeel van de publieke .NET bibliotheek. Het is dus niet verstandig om die klasse te gebruiken.
Het is echter ook niet een volledig interne class, want via ParseQueryString kun je zonder Reflection o.i.d. gewoon aan een public instance komen. Dat is weliswaar als een base class, maar het is nog altijd wel zo dat de publiek bereikbare ToString methode daar de gewijzigde implementatie van HttpValueCollection gebruikt. Die functionaliteit is dus wel public.

Je kunt inderdaad je eigen logica schrijven, zoals je al aangeeft. Het wordt echter interessanter om de ToString() te gebruiken wanneer je extra parameters toe wilt voegen aan (of bestaande weg wilt halen uit) een url query string.

Acties:
  • 0 Henk 'm!

  • SideShow
  • Registratie: Maart 2004
  • Laatst online: 16-06 15:55

SideShow

Administrator

Topicstarter
Fantastisch, met de HttpUtility class heb ik genoeg.