應用場景:在前端用ajax向服務器提交json對象數組,在controller的以對象數組作為函數的參數,提交的json數組直接轉為服務器端的對象數組。
如:
要將json對象數組[{Id:1,Name:"AA"},{Id:2,Name:"BB"}] 用ajax提交,
Controller代碼:
public EmptyResult Save(Models.User[] users) { return new EmptyResult(); }
方法一:
在前端將json對象用以下方式提交
var url = "http://localhost:8848/User/Save"; var data = {}; data["users[0].Id"] = 1; data["users[0].Name"] = "AA"; data["users[1].Id"] = 2; data["users[1].Name"] = "BB"; $.post(url, data, function () { alert("提交成功"); });
方法二:
在服務器端自定義ValueProvider

public class JsonArrayValueProviderFactory : ValueProviderFactory { public override IValueProvider GetValueProvider(ControllerContext controllerContext) { var formValues = controllerContext.HttpContext.Request.Form; var values = new Dictionary<string, object>(); Regex regex = new Regex(@"\[[A-Za-z]*\]"); for (int i = 0; i < formValues.Count; i++) { string key = formValues.Keys[i]; var matchs = regex.Matches(key); if (matchs.Count > 0) { foreach (Match match in matchs) { if (match.Value != "[]") key = key.Replace(match.Value, "." + match.Value.Trim('[', ']')); } if (key.EndsWith("[]")) values.Add(key.Replace("[]", ""), formValues.GetValues(i)); else values.Add(key, formValues[i]); } } return new DictionaryValueProvider<object>(values, System.Globalization.CultureInfo.InvariantCulture); } }
添加自定義的ValueProvider,可以再Application_Start執行
ValueProviderFactories.Factories.Add(new JsonArrayValueProviderFactory());
前端:
var url = "http://localhost:8848/User/Save"; var data = { users: [{ Id: 1, Name: "AA" }, { Id: 2, Name: "BB"}] }; $.post(url, data, function () { alert("提交成功"); });