-
-
Save mahizsas/6294480 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using Nancy.ModelBinding; | |
public class DynamicModelBinder : IModelBinder | |
{ | |
public object Bind(NancyContext context, Type modelType, object instance, BindingConfig configuration, params string[] blackList) | |
{ | |
var data = | |
GetDataFields(context); | |
var model = | |
DynamicDictionary.Create(data); | |
return model; | |
} | |
private static IDictionary<string, object> GetDataFields(NancyContext context) | |
{ | |
return Merge(new IDictionary<string, string>[] | |
{ | |
ConvertDynamicDictionary(context.Request.Form), | |
ConvertDynamicDictionary(context.Request.Query), | |
ConvertDynamicDictionary(context.Parameters) | |
}); | |
} | |
private static IDictionary<string, object> Merge(IEnumerable<IDictionary<string, string>> dictionaries) | |
{ | |
var output = | |
new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase); | |
foreach (var dictionary in dictionaries.Where(d => d != null)) | |
{ | |
foreach (var kvp in dictionary) | |
{ | |
if (!output.ContainsKey(kvp.Key)) | |
{ | |
output.Add(kvp.Key, kvp.Value); | |
} | |
} | |
} | |
return output; | |
} | |
private static IDictionary<string, string> ConvertDynamicDictionary(DynamicDictionary dictionary) | |
{ | |
return dictionary.GetDynamicMemberNames().ToDictionary( | |
memberName => memberName, | |
memberName => (string)dictionary[memberName]); | |
} | |
public bool CanBind(Type modelType) | |
{ | |
return modelType == typeof (DynamicDictionary); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Can be invoked using | |
http://localhost:40965/dynamic/nancy?age=10&value=test | |
Which would give you the following output | |
{ | |
"age": "10", | |
"value": "test", | |
"name": "nancy" | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Get["/dynamic/{name}"] = parameters => { | |
var model = | |
this.Bind<DynamicDictionary>(); | |
return Response.AsJson(model); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment