Как я могу отправить массив строк в ASP.NET MVC Controller без формы?

Я создаю небольшое приложение, чтобы преподавать ASP.NET MVC и JQuery, а одна из страниц – список элементов, в которых можно выбрать некоторые. Затем я хотел бы нажать кнопку и отправить список (или что-то подобное) моему controllerу, содержащему идентификаторы элементов, которые были выбраны, с использованием функции JQuery Post.

Мне удалось получить массив с идентификаторами элементов, которые были выбраны, и теперь я хочу опубликовать это. Один из способов сделать это – иметь фиктивную форму на моей странице со скрытым значением, а затем установить скрытое значение с выбранными элементами и опубликовать эту форму; это выглядит круто.

Есть ли более чистый способ достичь этого, отправив массив непосредственно на controller? Я пробовал несколько разных вещей, но похоже, что controller не может отображать полученные данные. Вот код:

function generateList(selectedValues) { var s = { values: selectedValues //selectedValues is an array of string }; $.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json"); } 

И тогда мой controller выглядит так

 public ActionResult GenerateList(List values) { //do something } 

Все, что мне удалось получить, это «нуль» в параметре controllerа …

Какие-нибудь советы?

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

Обновление: я обновил jQuery, чтобы установить «традиционный» параметр в true, чтобы он снова работал (за ответ @DustinDavis).

Сначала javascript:

 function test() { var stringArray = new Array(); stringArray[0] = "item1"; stringArray[1] = "item2"; stringArray[2] = "item3"; var postData = { values: stringArray }; $.ajax({ type: "POST", url: "/Home/SaveList", data: postData, success: function(data){ alert(data.Result); }, dataType: "json", traditional: true }); } 

И вот код в моем classе controllerа:

 public JsonResult SaveList(List values) { return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) }); } 

Когда я называю эту функцию javascript, я получаю сообщение «Первый элемент в списке:« item1 ». Надеюсь это поможет!

FYI: JQuery изменил способ их сериализации почтовых данных.

http://forum.jquery.com/topic/nested-param-serialization

Вы должны установить для параметра «Традиционный» значение true, другое разумное

 { Values : ["1", "2", "3"] } 

выйдет как

 Values[]=1&Values[]=2&Values[]=3 

вместо

 Values=1&Values=2&Values=3 

Спасибо всем за ответы. Еще одним быстрым решением будет использование метода jQuery.param с традиционным параметром, установленным в true, чтобы преобразовать объект JSON в строку:

 $.post("/your/url", $.param(yourJsonObject,true)); 

Не отправляйте данные в виде массива. Для привязки к списку пары ключ / значение должны быть представлены с одинаковым значением для каждого ключа.

Вам не нужна форма для этого. Вам просто нужен список пар ключ / значение, который вы можете включить в вызов $ .post.

В .NET4.5 , MVC 5

Javascript:

объект в JS: введите описание изображения здесь

механизм, который делает сообщение.

  $('.button-green-large').click(function() { $.ajax({ url: 'Quote', type: "POST", dataType: "json", data: JSON.stringify(document.selectedProduct), contentType: 'application/json; charset=utf-8', }); }); 

C #

Объекты:

 public class WillsQuoteViewModel { public string Product { get; set; } public List ClaimedFees { get; set; } } public partial class ClaimedFee //Generated by EF6 { public long Id { get; set; } public long JourneyId { get; set; } public string Title { get; set; } public decimal Net { get; set; } public decimal Vat { get; set; } public string Type { get; set; } public virtual Journey Journey { get; set; } } 

controller:

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Quote(WillsQuoteViewModel data) { .... } 

Полученный объект:

введите описание изображения здесь

Надеюсь, это сэкономит вам время.

Другая реализация, которая также работает со списком объектов, а не только строк:

JS:

 var postData = {}; postData[values] = selectedValues ; $.ajax({ url: "/Home/SaveList", type: "POST", data: JSON.stringify(postData), dataType: "json", contentType: "application/json; charset=utf-8", success: function(data){ alert(data.Result); } }); 

Предполагая, что ‘selectedValues’ – это массив объектов.

В controllerе параметр представляет собой список соответствующих ViewModels.

 public JsonResult SaveList(List values) { return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0].Name) }); } 

Как я уже говорил здесь ,

если вы хотите передать пользовательский объект JSON в действие MVC, вы можете использовать это решение, оно работает как шарм.

  public string GetData() { // InputStream contains the JSON object you've sent String jsonString = new StreamReader(this.Request.InputStream).ReadToEnd(); // Deserialize it to a dictionary var dic = Newtonsoft.Json.JsonConvert.DeserializeObject>(jsonString); string result = ""; result += dic["firstname"] + dic["lastname"]; // You can even cast your object to their original type because of 'dynamic' keyword result += ", Age: " + (int)dic["age"]; if ((bool)dic["married"]) result += ", Married"; return result; } 

Настоящая выгода от этого решения заключается в том, что вам не требуется определять новый class для каждой комбинации аргументов, а кроме того, вы можете легко сбрасывать объекты в свои исходные типы.

и вы можете использовать вспомогательный метод, подобный этому, чтобы облегчить вашу работу

 public static Dictionary GetDic(HttpRequestBase request) { String jsonString = new StreamReader(request.InputStream).ReadToEnd(); return Newtonsoft.Json.JsonConvert.DeserializeObject>(jsonString); } 

Вы можете настроить глобальный параметр с помощью

 jQuery.ajaxSettings.traditional = true; 

Ответ очень помог мне в моей ситуации, поэтому спасибо за это. Однако для будущих ссылок люди должны привязываться к модели, а затем проверять ее. Этот пост от Фила Хаака описывает это для MVC 2. http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx

Надеюсь, это поможет кому-то.

  • Как обращаться с Dynamic JSON в Модернизации?
  • Как декодировать поле полилиний API Google Directions в длинные точки lat в объективе C для iPhone?
  • Как отправить строку JSON в запрос POST в Go
  • Как читать userData в jqgrid?
  • Обеспечение json-ключей в .NET
  • Как сериализовать class с интерфейсом?
  • Отправьте данные JSON через POST (ajax) и получите ответ json от Controller (MVC)
  • Дооснащение Ожидаемое BEGIN_OBJECT, но BEGIN_ARRAY
  • Как превратить json в class case, когда class case имеет только одно поле
  • Как превратить объект C # в строку JSON в .NET?
  • Как избежать специальных символов при построении строки JSON?
  • Давайте будем гением компьютера.