将querystring从/转换为对象

我有这个(简化的)课程:

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

我必须将它的实例转换为这样的查询字符串:

 "BaseNo=5&Width=100" 

另外,我必须将这样的查询字符串转换回该类的对象中。

我知道这几乎就是一个模型绑定器所做的事情,但是在我的情况下我没有控制器上下文(一些在线程中运行的深埋类)。

那么,是否有一种简单的方法可以在没有控制器上下文的情况下转换查询字符串中的对象并返回?

使用模型绑定会很棒,但我不知道如何。

您可以使用reflection,如下所示:

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

你需要实现Parse方法,只需使用int.Parse,decimal.Parse,DateTime.Parse等。

将此Parse方法与ivowiblo的解决方案(已接受的答案)一起使用:

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

使用Newtonsoft Json序列化器和linq的解决方案:

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

您可以通过从查询字符串中检索相关值来在其构造函数中设置此对象的属性

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

并且您可以通过重写ToString方法来确保将对象转换为正确的查询字符串格式。

 public override string ToString() { return String.Format("BaseNo={0}&Width={1}", this.BaseNo, this.Width); } 

您仍然需要在适当的位置构造和调用ToString ,但这应该有所帮助。

只要没有任何属性匹配任何其他路由参数,如controller,action,id等,这应该可以工作。

 new RouteValueDictionary(Model) 

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

初始化RouteValueDictionary类的新实例,并添加基于指定对象的属性的值。

要从查询字符串中解析回来,您可以将模型类用作操作参数,并让ModelBinder完成它的工作。

你可以使用.NET的HttpUtility.ParseQueryString()方法:

HttpUtility.ParseQueryString("a=b&c=d")产生一个NameValueCollection

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