将querystring从/转换为对象

Mar*_*arc 22 c# asp.net-mvc-3

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

public class StarBuildParams
{
    public int BaseNo { get; set; }
    public int Width { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

"BaseNo=5&Width=100"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ivo*_*Ivo 27

您可以使用反射,如下所示:

public T GetFromQueryString<T>() 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;
 }
Run Code Online (Sandbox Code Playgroud)

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


Anu*_*ngh 14

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

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


小智 14

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

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

  • 当查询字符串包含数组时,这将不起作用,例如P [0] [A] = xxx&P [0] [B] = yyyy&P [1] [A] = aaaa&P [1] [B] = bbbb (3认同)
  • 这个答案挽救了我的整个职业生涯 (2认同)

Sha*_*med 6

序列化查询字符串并反序列化为您的类对象

 JObject json;
 Request.RequestUri.TryReadQueryAsJson(out json);
 string sjson = JsonConvert.SerializeObject(json);
 StarBuildParams query = JsonConvert.DeserializeObject<StarBuildParams>(sjson);
Run Code Online (Sandbox Code Playgroud)


Kir*_*rst 5

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

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

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

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

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


Ofe*_*lig 5

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

HttpUtility.ParseQueryString("a=b&c=d")产生NameValueCollection这样的:

[0] Key = "a", Value = "b"
[1] Key = "c", Value = "d"
Run Code Online (Sandbox Code Playgroud)