Я успешно прошел WebForms для вызовов AJAX с относительно сложным набором параметров (вызываемых с использованием jQuery.ajax).Мы пытаемся использовать тот же подход в MVC 3, но, похоже, с первого раза сталкиваемся с тем, что MVC не удалось успешно десериализовать массивы словаря.
Подход, который работает без проблем в ASP.NET WebForms "classic"ниже:
[WebMethod]
public static JQGrid.JQGridData GetListForJQGrid(int? iPageSize, int? iPage, int? iMaxRecords, string sSortField, string sSortOrder,
Dictionary<string, string> dSearchOptions, Dictionary<string, object>[] aOriginalColumnDefinition, string[] aExtraDataColumns)
И ниже эквивалент MVC 3: (хотя бы одно и то же имя / параметры - другой тип возвращаемого значения, но я не думаю, что это уместно)
[HttpPost]
public JSONResult GetListForJQGrid(int? iPageSize, int? iPage, int? iMaxRecords, string sSortField, string sSortOrder,
Dictionary<string, string> dSearchOptions, Dictionary<string, object>[] aOriginalColumnDefinition, string[] aExtraDataColumns)
С помощью WebMethod все данные отлично десериализуются.Тем не менее, когда вызывается метод MVC, все простые параметры десериализуются нормально, но по неизвестной причине массив словаря поступает в виде массива нулей.
Итак, в конце этого ряда вопросов:
- Кто-нибудь еще испытывал проблемы с десериализацией массивов словарей в MVC 3?
- Разве MVC 3 по умолчанию не использует System.Web.Script.Serialization.JavaScriptSerializer, то есть я думаю, что веб-методы ASP.NET используют под капотом?
- Могу ли я заставить MVC 3 использовать System.Web.Script.Serialization.JavaScriptSerializer вместо того, что он использует?
- Или я что-то упускаю / должен ли мой подход немного отличаться?Обратите внимание, что, по крайней мере, сейчас нам нужно разделить код на стороне клиента между классическими ASP.NET WebMethods и MVC 3, и поэтому мы хотим, чтобы он оставался как есть.
- Наконец, я могу видеть тамЭто возможный обходной путь, который можно использовать, глядя на этот вопрос: POST json dictionary .Является ли этот обходной путь единственной игрой в городе или что-то улучшилось с тех пор, как был задан этот вопрос?
jQuery AJAX call:
$.ajax(_oJQGProperties.sURL, //URL of WebService/PageMethod used
{
data: JSON.stringify(oPostData),
type: "POST",
contentType: "application/json",
complete: DataCallback
});
Пример JSON.stringify (oPostData):
{
"dSearchOptions":{},
"aOriginalColumnDefinition":
[
{"name":"ID","sortable":false,"hidedlg":true,"align":"right","title":false,"width":40},
{"name":"URL","sortable":false,"hidedlg":true,"align":"left","title":false,"width":250,"link":"javascript:DoSummat(this,'{0}');","textfield":"Name"},
{"name":"Description","sortable":false,"hidedlg":true,"align":"left","title":false,"width":620}
],
"aExtraDataColumns":["Name"],
"_search":false,
"iPageSize":-1,
"iPage":1,
"sSortField":"",
"sSortOrder":"",
"iMaxRecords":0
}