2014-11-21 2 views
0

Я видел много сообщений, которые, кажется, несколько затрагивают мою ситуацию, но все они оставляют меня немного смущенным.Добавление JSON в список в моем контроллере

У меня есть объект, который я POST Вход в мой контроллер. У меня есть сообщение приходит на мой контроллер ладно, делая это:

$('#fileSubmit').click(function() { 
    var filesObj = []; 

    $('#fileList .files .fileName').each(function() { 
     var name = $(this).text(); 
     filesObj.push({ 'name': name }); 
    }); 

    $.ajax({ 
     type: "POST", 
     url: "/FileUpload/ImportCommit", 
     data: filesObj, 
     dataType: "json" 
    }); 
}); 

Я хочу, чтобы затем принять, что объект JSON и поместить его в список в моем контроллере. Пока что у меня есть, но я не сделал много кодирования на C# и не знаю, что делать дальше.

[HttpPost] 
public ActionResult ImportCommit(List<string> filenames) 
{ 

} 

Я знаю, что мой код метода контроллера пуст, но я не уверен, что делать дальше. Любая помощь приветствуется. Благодаря!

+0

что пусто? параметр filenames или код вашего контроллера? – RandomUs1r

+0

К сожалению, код метода контроллера пуст. – scapegoat17

+0

Итак, если имена файлов имеют значения, которые вы сделали, нет? имена файлов уже имеют список типов, - это тип списка в этом списке. Я беру filesObj - это просто строка имен JSON без каких-либо свойств или атрибутов. Чтобы работать с вашим списком, просто манипулируйте именами файлов. – RandomUs1r

ответ

0

Хитрость в том, чтобы изменить мой AJAX к POST так:

$.ajax({ 
    type: "POST", 
    url: "/dat/Controller", 
    data: JSON.stringify(filesObj), 
    contentType: "application/json", 
    traditional: true, 
    success: function (result) { 
     console.log("Success: " + result); 
    }, 
    error: function (result) { 
     console.log("Error: " + result); 
    } 
}); 

Изменение dataType в contentType и добавление traditional: true, казалось, сделать трюк для меня. Причина этого (я считаю) заключается в том, что фактические данные, которые я отправлял, технически не являются JSON. Я добавил traditional: true, чтобы быть в безопасности.

0

Данные отправления, передаваемые через поле данных метода ajax, должны быть парными значениями. Asp.Net будет отображать их в коллекции запросов Params через их имя. Например. если вы разместите объект, как это,

{ 
    fileNames: JSON.stringify(arFileNames) 
}; 

Это могут быть доступны на стороне сервера с помощью,

string json = HttpContext.Current.Request.Params["fileNames"]; 

Если ваш JSON выглядит примерно так,

"{"filenames":["somefile","somefile2","somefile3"]}" 

Вы можете использовать newtonsoft JSON (JSON.Net), чтобы преобразовать его в список строк by creatong для его представления,

public class JsonResultFileNames 
{ 
    [Newtonsoft.Json.JsonProperty(PropertyName = "filenames")] 
    public string[] FileNames { get; set; }   
} 

Затем преобразовать JSON в JsonResultFileNames с,

JsonResultFileNames jsonResult = Newtonsoft.Json.JsonConvert.DeserializeObject<JsonResultFileNames>(jsonStringHere); 

Тогда у вас есть C# объект, представляющий данные JSON. Кроме того, вы можете усложниться с этим, но важно отметить JSON.Net, это довольно буквально десериализуется в представление C#. Например. если вы хотите десериализовать прямо в массив строк, тогда в вашем json должен быть только массив строк (имена объектов/полей и т. д.).

E.g. где я работаю, у нас есть api, который возвращает результаты, подобные этому,

{ status: { статус: true; }, customerdata { идентификатор: {некоторые-справ}, Имя: Некоторые Имя клиента }}

Проблема с этим, мой C# класс должен состоять из вложенных классов, например, Мне нужен класс для представления статуса и класса для представления данных клиента. Когда вы делаете это, вы можете получить странное наименование мудрости, у меня появились такие вещи, как CustomerResponse, CustomerResponseStatus, CustomerResponseData, где CustomerResponseStatus и CustomerResponseData отображаются в CustomerRespnose, и я десериализую json для типа CustomerResponse.

Если ваш json - это всего лишь массив строк, вы можете использовать строку [] для типа, переданного в JsonConvert.Deserialize, что не потребует от вас создания классов ответов для хранения данных.

Смежные вопросы