Как я могу отправить массив строк в ASP.NET MVC Controller без формы?
Я создаю небольшое приложение, чтобы преподавать ASP.NET MVC и JQuery, а одна из страниц – список элементов, в которых можно выбрать некоторые. Затем я хотел бы нажать кнопку и отправить список (или что-то подобное) моему controllerу, содержащему идентификаторы элементов, которые были выбраны, с использованием функции JQuery Post.
Мне удалось получить массив с идентификаторами элементов, которые были выбраны, и теперь я хочу опубликовать это. Один из способов сделать это – иметь фиктивную форму на моей странице со скрытым значением, а затем установить скрытое значение с выбранными элементами и опубликовать эту форму; это выглядит круто.
Есть ли более чистый способ достичь этого, отправив массив непосредственно на controller? Я пробовал несколько разных вещей, но похоже, что controller не может отображать полученные данные. Вот код:
- Анализ вложенных данных JSON с использованием GSON
- Специальная сериализация Jackson JSON для определенных полей
- Публикация ECMA-404 повлияла на достоверность текстов JSON, таких как «2» или «привет»?
- Сериализация перечислений с помощью Jackson
- Преобразование JSON в XLS / CSV в Java
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а …
Какие-нибудь советы?
- org.json.JSONObject не может быть преобразован в JSONArray в android
- Как получить доступ к имени / значению объекта JSON?
- Использовать имя classа в качестве корневого ключа для сериализации JSON Jackson
- Android Java; Как разобрать локальный файл JSON из папки с данными в ListView
- Правильный способ написать JSON deserializer весной или расширить его
- Передача данных из одной активности в другую с помощью пакета - не отображение во второй активности
- Автозаполнение jQuery UI с помощью JSON
- jQuery отправляет действительный json в тело запроса
Я изменил свой ответ, чтобы включить код для тестового приложения, которое я сделал.
Обновление: я обновил 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
Надеюсь, это поможет кому-то.