Asp.Net Web API中带字典参数的方法

我需要对包含Dictionary作为参数的方法发出GET请求。 我浏览但无法找到有关如何发送字典的任何信息,所以我的请求命中我的方法。 方法签名如下所示

public void AddItems(Dictionary Items) 

最好的祝福,

凯末尔

您是否阅读过ASP.NET Wire Format for Model Binding to Arrays,Lists,Collections,Dictionaries

我写了一个完全符合你想要的ModelBinder:

 public class DictionaryModelBinder : DefaultModelBinder { private const string _dateTimeFormat = "dd/MM/yyyy HH:mm:ss"; private enum StateMachine { NewSection, Key, Delimiter, Value, ValueArray } public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var stream = controllerContext.HttpContext.Request.InputStream; string text; stream.Position = 0; using (var reader = new StreamReader(stream)) { text = reader.ReadToEnd(); } int index = 0; return Build(text, ref index); } private static Dictionary Build(string text, ref int index) { var state = StateMachine.NewSection; var dictionary = new Dictionary(); var key = string.Empty; object value = string.Empty; for (; index < text.Length; ++index) { if (state == StateMachine.NewSection && text[index] == '{') { dictionary = new Dictionary(); state = StateMachine.NewSection; } else if (state == StateMachine.NewSection && text[index] == '"') { key = string.Empty; state = StateMachine.Key; } else if (state == StateMachine.Key && text[index] != '"') { key += text[index]; } else if (state == StateMachine.Key && text[index] == '"') { state = StateMachine.Delimiter; } else if (state == StateMachine.Delimiter && text[index] == ':') { state = StateMachine.Value; value = string.Empty; } else if (state == StateMachine.Value && text[index] == '[') { state = StateMachine.ValueArray; value = value.ToString() + text[index]; } else if (state == StateMachine.ValueArray && text[index] == ']') { state = StateMachine.Value; value = value.ToString() + text[index]; } else if (state == StateMachine.Value && text[index] == '{') { value = Build(text, ref index); } else if (state == StateMachine.Value && text[index] == ',') { dictionary.Add(key, ConvertValue(value)); state = StateMachine.NewSection; } else if (state == StateMachine.Value && text[index] == '}') { dictionary.Add(key, ConvertValue(value)); return dictionary; } else if (state == StateMachine.Value || state == StateMachine.ValueArray) { value = value.ToString() + text[index]; } } return dictionary; } private static object ConvertValue(object value) { string valueStr; if (value is Dictionary || value == null || (valueStr = value.ToString()).Length == 0) { return value; } bool boolValue; if (bool.TryParse(valueStr, out boolValue)) { return boolValue; } int intValue; if (int.TryParse(valueStr, out intValue)) { return intValue; } double doubleValue; if (double.TryParse(valueStr, out doubleValue)) { return doubleValue; } valueStr = valueStr.Trim('"'); DateTime datetimeValue; if (DateTime.TryParseExact(valueStr, _dateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out datetimeValue)) { return datetimeValue; } if (valueStr.First() == '[' && valueStr.Last() == ']') { valueStr = valueStr.Trim('[', ']'); if (valueStr.Length > 0) { if (valueStr[0] == '"') { return valueStr .Split(new[] { '"' }, StringSplitOptions.RemoveEmptyEntries) .Where(x => x != ",") .ToArray(); } else { return valueStr .Split(',') .Select(x => ConvertValue(x.Trim())) .ToArray(); } } } return valueStr; } } 

您可以在我的博客中看到更多解释和完整post:

Json To Dictionary通用模型活页夹

您可以使用字典作为参数以这种方式:

 protected object DictionaryFunction() { Dictionary YourDictionaryObjectName=new Dictionary(); ... ... return YourDictionaryObjectName; } protected MyFunction() { Dictionary MyDictionary=(Dictionary)DictionaryFunction(); }