У меня проблема, я не могу добавить пользовательские объекты в свой список. Однако, если я добавлю некоторые предопределенные объекты (строки, целые числа...), мой код работает отлично. Это мой класс, который всегда возвращается на все вызовы ajax этому контроллеру, он содержит логическое состояние и список объектов.
public class returnData
{
public bool status { get; set; }
public List<object> data { get; set; }
}
Это класс для объекта, который я хочу добавить в этот список:
public class file
{
public string ID { get; set; }
public string Name { get; set; }
public string Type { get; set; }
}
Код, в котором я использую это:
returnData data = new returnData();
...
DriveFile file = JsonConvert.DeserializeObject<DriveFile>(Json);
file f = new file();
if (file.mimeType == "application/vnd.google-apps.folder")
{
f.Type = "folder";
f.ID = file.id;
f.Name = file.title;
data.data.Add(f);
}
Ошибка, которую я получаю, не имеет никакой полезной информации, поскольку этот код компилируется, и ошибка возникает в журнале Chrome Console при выполнении ajax.
Изображение консоли Google Chrome
Однако, когда я использую эту строку кода
data.data.add("some string");
моя функция будет работать безупречно и вернуть Object, который содержит логическое состояние и список объектов (строки, целые числа).
Итак, вернемся к моему вопросу, как добавить свои объекты в этот список?
EDIT: ошибок на стороне сервера нет, код компилируется и работает нормально, поэтому это, вероятно, некоторая ошибка jquery/ajax.
Это код ajax для моего отладчика:
86 $.ajax({
87 url: $('#url').val(),
88 type: $('#type option:selected').val(),
89 contentType: "application/json; charset=utf-8",
90 dataType: "json",
91 data: $('#data').val(),
92 success: function (result){
93 console.log(result)
94 },
95 error: function (err){
96 console.log(err)
97 }
98 });
Вот полный метод, но метод кажется ОК, это ajax или что-то делать с jquery, я думаю.
[OperationContract]
public returnData listChildren(string folderId)
{
returnData data = new returnData();
List<object> myList= new List<object>();
bool status = true;
try
{
string Json = Response("https://www.googleapis.com/drive/v2/files/" + folderId + "/children", "GET");
//get the children list
if (!Json.Contains("error"))
{
DriveChildlist list = JsonConvert.DeserializeObject<DriveChildlist>(Json);
foreach (DriveChildren child in list.items)
{
string uriString = child.childLink;
//get the info for each child in the list
Json = Response(uriString, "GET");
if (!Json.Contains("error"))
{
DriveFile file = JsonConvert.DeserializeObject<DriveFile>(Json);
file f = new file();
if (file.mimeType == "application/vnd.google-apps.folder")
{
f.Type = "folder";
f.ID = file.id;
f.Name = file.title;
data.data.Add(f);
}
else if (file.mimeType == "application/myMimeType")
{
f.Type = "file";
f.ID = file.id;
f.Name = file.title;
data.data.Add(f);
}
}
else
{
status = false;
}
}
}
else
{
status = false;
}
}
catch(Exception)
{
status = false;
}
data.status = status;
if (!status)
{
data.data = null;
//data.data is null if status is false
}
return data;
}
Я решил это с помощью Newtonsoft.Json. Я сериализую объект, используя этот код:
string jsondata = JsonConvert.SerializeObject(data);
а затем я вернул сериализованную строку вместо объекта. Похоже, что центр разработки визуальной студии не смог сериализовать мой объект, даже после добавления [Serializable()] в мой класс. Любая информация по этому поводу?
Как написано, ваш код С# не будет работать, но будет компилироваться. Он выдает ошибку при вызове ajax и вы никогда не увидите сообщение об ошибке (в зависимости от настройки вашей системы).
Вот правильный код (учитывая ваш фрагмент)
returnData data = new returnData();
data.data = new List<object>();
// rest of your code.