2012-03-22 25 views
18

Tôi có điều này lớp (giản thể):Chuyển đổi chuỗi truy vấn từ/phản đối

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

Và tôi phải chuyển trường hợp của nó vào một chuỗi truy vấn như thế này:

"BaseNo=5&Width=100" 

Bên cạnh đó tôi phải chuyển đổi một chuỗi truy vấn trở lại trong một đối tượng của lớp đó.

Tôi biết rằng điều này là khá nhiều so với mô hình, nhưng tôi không có ngữ cảnh điều khiển trong tình huống của mình (một số lớp được chôn sâu trong chuỗi).

Vì vậy, có cách đơn giản để chuyển đổi một đối tượng trong chuỗi truy vấn và ngược lại mà không có ngữ cảnh điều khiển không?

Thật tuyệt vời khi sử dụng modelbinding nhưng tôi không biết cách thực hiện.

+0

Tất cả những gì tôi có thể nghĩ đến là sử dụng phản ánh. – ojlovecd

+0

@ojlovecd Phản ánh sự trợ giúp ở đây như thế nào? –

+0

Tôi chắc chắn rằng tình huống này có thể tránh được. Bạn có thể mô tả kịch bản của bạn? Làm thế nào bạn kết thúc bằng một chuỗi truy vấn trong lớp này? –

Trả lời

23

Bạn có thể sử dụng phản chiếu, một cái gì đó như thế này:

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; 
} 

Bạn sẽ cần phải thực hiện các phương pháp Parse, chỉ cần sử dụng int.Parse, decimal.Parse, DateTime.Parse vv

4

Bạn có thể thiết lập các thuộc tính của đối tượng này trong constructor của nó bằng cách lấy các giá trị có liên quan từ querystring

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

và bạn có thể đảm bảo rằng các đối tượng được chuyển đổi sang định dạng chuỗi truy vấn chính xác bằng cách ghi đè các phương pháp ToString.

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

Bạn vẫn sẽ cần phải xây dựng và gọi ToString ở những nơi thích hợp, nhưng điều này sẽ hữu ích.

3

Điều này nên làm việc quá lâu như không ai trong số các thuộc tính phù hợp với bất kỳ thông số tuyến đường khác như bộ điều khiển, hành động, id vv

new RouteValueDictionary(Model) 

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

Khởi tạo phiên bản mới của lớp RouteValueDictionary và thêm giá trị dựa trên thuộc tính từ đối tượng được chỉ định.

Để phân tích cú pháp ngược lại từ chuỗi truy vấn, bạn có thể sử dụng lớp mô hình làm thông số hành động và để cho ModelBinder thực hiện công việc.

9

Cho phép thực hiện việc này ... Đây là phương pháp Parse.

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

Bạn chỉ có thể sử dụng.HttpUtility.ParseQueryString() phương pháp NET của:

HttpUtility.ParseQueryString("a=b&c=d") tạo ra một NameValueCollection như vậy:

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

Một giải pháp với Newtonsoft Json serializer và 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); 
+0

Điều này không hoạt động khi chuỗi truy vấn chứa mảng, ví dụ: P [0] [A] = xxx & P [0] [B] = yyyy & P [1] [A] = aaaa & P [1] [B] = bbbb – DrGriff

+0

Như thế! điều này đã hoạt động mà không có ngữ cảnh.Yêu cầu –

Các vấn đề liên quan