我正在使用jQuery在ASP.NET MVC中使用Http Post进行Ajax调用。我希望能够传递值字典。
我能想到的最接近的东西是传递多维的字符串数组,但是实际上传递给ActionResult方法的结果是一个包含“键/值”对的字符串连接的一维字符串数组。
例如,下面的“值”数组中的第一项包含以下值:
"id,200"
这是我的ActionResult方法的示例:
public ActionResult AddItems(string[] values) { // do something }
这是我如何从jQuery调用方法的示例:
$.post("/Controller/AddItems", { values: [ ["id", "200"], ["FirstName", "Chris"], ["DynamicItem1", "Some Value"], ["DynamicItem2", "Some Other Value"] ] }, function(data) { }, "json");
有谁知道如何将字典对象从jQuery传递到ActionResult方法而不是数组?
我真的很想这样定义我的ActionResult:
public ActionResult AddItems(Dictionary<string, object> values) { // do something }
有什么建议?
更新: 我尝试在值中传递逗号,这基本上使使用字符串解析实际上无法解析键/值对。
通过此:
values: [ ["id", "200,300"], ["FirstName", "Chris"] ]
结果:
values[0] = "id,200,300"; values[1] = "FirstName,Chris";
最后我想通了!谢谢大家的建议!我终于找到了最好的解决方案,就是通过Http Post传递JSON并使用自定义ModelBinder将JSON转换为Dictionary。我在解决方案中所做的一件事是创建了一个从Dictionary继承的JsonDictionary对象,以便可以将自定义ModelBinder附加到JsonDictionary类型,并且如果以后将Dictionary作为ActionResult参数使用时,将来也不会引起任何冲突。与JSON的目的不同。
这是最终的ActionResult方法:
public ActionResult AddItems([Bind(Include="values")] JsonDictionary values) { // do something }
和jQuery“ $ .post”调用:
$.post("/Controller/AddItems", { values: Sys.Serialization.JavaScriptSerializer.serialize( { id: 200, "name": "Chris" } ) }, function(data) { }, "json");
然后需要注册JsonDictionaryModelBinder,我将其添加到Global.asax.cs中的Application_Start方法中:
protected void Application_Start() { ModelBinders.Binders.Add(typeof(JsonDictionary), new JsonDictionaryModelBinder()); }
最后,这是我创建的JsonDictionaryModelBinder对象和JsonDictionary对象:
public class JsonDictionary : Dictionary<string, object> { public JsonDictionary() { } public void Add(JsonDictionary jsonDictionary) { if (jsonDictionary != null) { foreach (var k in jsonDictionary.Keys) { this.Add(k, jsonDictionary[k]); } } } } public class JsonDictionaryModelBinder : IModelBinder { #region IModelBinder Members public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { if (bindingContext.Model == null) { bindingContext.Model = new JsonDictionary(); } var model = bindingContext.Model as JsonDictionary; if (bindingContext.ModelType == typeof(JsonDictionary)) { // Deserialize each form/querystring item specified in the "includeProperties" // parameter that was passed to the "UpdateModel" method call // Check/Add Form Collection this.addRequestValues( model, controllerContext.RequestContext.HttpContext.Request.Form, controllerContext, bindingContext); // Check/Add QueryString Collection this.addRequestValues( model, controllerContext.RequestContext.HttpContext.Request.QueryString, controllerContext, bindingContext); } return model; } #endregion private void addRequestValues(JsonDictionary model, NameValueCollection nameValueCollection, ControllerContext controllerContext, ModelBindingContext bindingContext) { foreach (string key in nameValueCollection.Keys) { if (bindingContext.PropertyFilter(key)) { var jsonText = nameValueCollection[key]; var newModel = deserializeJson(jsonText); // Add the new JSON key/value pairs to the Model model.Add(newModel); } } } private JsonDictionary deserializeJson(string json) { // Must Reference "System.Web.Extensions" in order to use the JavaScriptSerializer var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); return serializer.Deserialize<JsonDictionary>(json); } }