روشی برای DeSerialize کردن QueryString به یک کلاس
پنج شنبه 28 آبان 1394 8:08 AM
چند روز پیش در حال استفاده از افزونهی jQuery Bootgrid بودم که دادههای خود را در قالب زیر به صورت کوئری استرینگ ارسال میکند.
1
|
current=1&rowCount=10&sort[sender]=asc&searchPhrase=&id=b0df282a-0d67-40e5-8558-c9e93b7befed |
1
2
3
4
5
6
7
8
9
|
[AttributeUsage(AttributeTargets.Property,Inherited = true )] public class RequestBodyField:Attribute { public string Field; public RequestBodyField( string field) { this .Field = field; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class EmployeesRequestBody { [RequestBodyField( "current" )] public int CurrentPage { get ; set ; } [RequestBodyField( "rowcount" )] public int RowCount { get ; set ; } [RequestBodyField( "searchPhrase" )] public string SearchPhrase { get ; set ; } [RequestBodyField( "sort" )] public NameValueCollection SortDictionary { get ; set ; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public T GetFromQueryString<T>() where T : new () { var obj = new T(); var queryString = HttpContext.Current.Request.QueryString; var queries = HttpUtility.ParseQueryString(queryString.ToString()); var properties = typeof (T).GetProperties(); foreach (var property in properties) { foreach (Attribute attribute in property.GetCustomAttributes( true )) { var requestBodyField = attribute as RequestBodyField; if (requestBodyField == null ) continue ; //get value of query string var valueAsString = queries[requestBodyField.Field]; var converter = TypeDescriptor.GetConverter(property.PropertyType); var value = converter.ConvertFrom(valueAsString); if (value == null ) continue ; property.SetValue(obj, value, null ); } } return obj; } |
1
|
HttpContext.Current.Request.QueryString |
1
2
|
var converter = TypeDescriptor.GetConverter(property.PropertyType); var value = converter.ConvertFrom(valueAsString); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
if (valueAsString == null ) { var keys = from key in queries.AllKeys where key.StartsWith(requestBodyField.Field) select key; var collection = new NameValueCollection(); foreach (var key in keys) { var openBraketIndex = key.IndexOf( "[" , StringComparison.Ordinal); var closeBraketIndex = key.IndexOf( "]" , StringComparison.Ordinal); if (openBraketIndex < 0 || closeBraketIndex < 0) throw new Exception( "query string is corrupted." ); openBraketIndex++; //get key in [...] var fieldName = key.Substring(openBraketIndex, closeBraketIndex - openBraketIndex); collection.Add(fieldName, queries[key] ); } property.SetValue(obj, collection, null ); continue ; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
public T GetFromQueryString<T>() where T : new () { var obj = new T(); var properties = typeof (T).GetProperties(); var queryString = HttpContext.Current.Request.QueryString; var queries = HttpUtility.ParseQueryString(queryString.ToString()); foreach (var property in properties) { foreach (Attribute attribute in property.GetCustomAttributes( true )) { var requestBodyField = attribute as RequestBodyField; if (requestBodyField == null ) continue ; //get value of query string var valueAsString = queries[requestBodyField.Field]; if (valueAsString == null ) { var keys = from key in queries.AllKeys where key.StartsWith(requestBodyField.Field) select key; var collection = new NameValueCollection(); foreach (var key in keys) { var openBraketIndex = key.IndexOf( "[" , StringComparison.Ordinal); var closeBraketIndex = key.IndexOf( "]" , StringComparison.Ordinal); if (openBraketIndex < 0 || closeBraketIndex < 0) throw new Exception( "query string is corrupted." ); openBraketIndex++; //get key in [...] var fieldName = key.Substring(openBraketIndex, closeBraketIndex - openBraketIndex); collection.Add(fieldName, queries[key]); } property.SetValue(obj, collection, null ); continue ; } var converter = TypeDescriptor.GetConverter(property.PropertyType); var value = converter.ConvertFrom(valueAsString); if (value == null ) continue ; property.SetValue(obj, value, null ); } } return obj; } |
1
2
3
4
|
public virtual ActionResult GetEmployees() { var request = new Requests().GetFromQueryString<EmployeesRequestBody>(); } |