Convertir la chaîne de requête de / en object

J’ai cette classe (simplifiée):

public class StarBuildParams { public int BaseNo { get; set; } public int Width { get; set; } } 

Et je dois en transformer des instances en chaîne de requête comme celle-ci:

 "BaseNo=5&Width=100" 

De plus, je dois transformer une telle chaîne de requête en un object de cette classe.

Je sais que c’est à peu près ce que fait un modelbinder, mais je n’ai pas le contexte du contrôleur dans ma situation (une classe profondément enfouie s’exécutant dans un thread).

Alors, existe-t-il un moyen simple de convertir un object dans une chaîne de requête et vice versa sans avoir un contexte de contrôleur?

Ce serait bien d’utiliser la reliure de modèle, mais je ne sais pas comment.

Vous pouvez utiliser la reflection, quelque chose comme ceci:

 public T GetFromQuerySsortingng() where T : new(){ var obj = new T(); var properties = typeof(T).GetProperties(); foreach(var property in properties){ var valueAsSsortingng = HttpContext.Current.Request.QuerySsortingng[property.PropertyName]; var value = Parse( valueAsSsortingng, property.PropertyType); if(value == null) continue; property.SetValue(obj, value, null); } return obj; } 

Vous devrez implémenter la méthode Parse, en utilisant simplement int.Parse, decimal.Parse, DateTime.Parse, etc.

Utilisez cette méthode Parse avec la solution ivowiblo (réponse acceptée):

 public object Parse(ssortingng valueToConvert, Type dataType) { TypeConverter obj = TypeDescriptor.GetConverter(dataType); object value = obj.ConvertFromSsortingng(null, CultureInfo.InvariantCulture, valueToConvert); return value; } 

Une solution avec Newtonsoft Json serializer et linq:

 ssortingng responseSsortingng = "BaseNo=5&Width=100"; var dict = HttpUtility.ParseQuerySsortingng(responseSsortingng); ssortingng json = JsonConvert.SerializeObject(dict.Cast().ToDictionary(k => k, v => dict[v])); StarBuildParams respObj = JsonConvert.DeserializeObject(json); 

Vous pouvez définir les propriétés de cet object dans son constructeur en récupérant les valeurs pertinentes de la chaîne de requête.

 public StarBuildParams() { this.BaseNo = Int32.Parse(Request.QuerySsortingng["BaseNo"].ToSsortingng()); this.Width = Int32.Parse(Request.QuerySsortingng["Width"].ToSsortingng()); } 

et vous pouvez vous assurer que l’object est converti au format de chaîne de requête correct en substituant la méthode ToSsortingng .

 public override ssortingng ToSsortingng() { return Ssortingng.Format("BaseNo={0}&Width={1}", this.BaseNo, this.Width); } 

Vous aurez toujours besoin de construire et d’appeler ToSsortingng aux endroits appropriés, mais cela devrait aider.

Cela devrait fonctionner tant qu’aucune des propriétés ne correspond à aucun autre paramètre de route tel que contrôleur, action, id, etc.

 new RouteValueDictionary(Model) 

http://msdn.microsoft.com/en-us/library/cc680272.aspx

Initialise une nouvelle instance de la classe RouteValueDictionary et ajoute des valeurs basées sur les propriétés de l’object spécifié.

Pour parsingr de nouveau la chaîne de requête, vous pouvez utiliser la classe de modèle en tant que paramètre d’action et laisser le ModelBinder s’en charger.

Vous pouvez simplement utiliser la méthode HttpUtility.ParseQuerySsortingng() de .NET:

HttpUtility.ParseQuerySsortingng("a=b&c=d") produit une NameValueCollection tant que telle:

 [0] Key = "a", Value = "b" [1] Key = "c", Value = "d"