Я создаю небольшое приложение для обучения ASP.NET MVC и JQuery, и одна из страниц представляет собой список элементов, в которых некоторые из них могут быть выбраны. Затем я хотел бы нажать кнопку и отправить на мой контроллер список (или что-то подобное), содержащий идентификаторы выбранных элементов, используя функцию Post в JQuery.
Мне удалось получить массив с идентификаторами выбранных элементов, и теперь я хочу опубликовать это. Один из способов сделать это - создать на моей странице фиктивную форму со скрытым значением, а затем установить скрытое значение с выбранными элементами и опубликовать эту форму; это выглядит грубым, хотя.
Есть ли более чистый способ добиться этого, отправив массив непосредственно в контроллер? Я пробовал несколько разных вещей, но похоже, что контроллер не может отобразить данные, которые он получает. Вот код на данный момент:
function generateList(selectedValues) {
var s = {
values: selectedValues //selectedValues is an array of string
};
$.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
И тогда мой контроллер выглядит так
public ActionResult GenerateList(List<string> values)
{
//do something
}
Все, что мне удалось получить, это «ноль» в параметре контроллера ...
Какие-нибудь советы?
источник
Request["values[]"]
Ответы:
Я изменил свой ответ, добавив код для тестового приложения, которое я сделал.
Обновление: я обновил jQuery, чтобы установить для «традиционного» параметра значение true, чтобы это снова сработало (для ответа @DustinDavis).
Сначала яваскрипт:
И вот код в моем классе контроллера:
Когда я вызываю эту функцию javascript, я получаю предупреждение «Первый элемент в списке:« item1 »». Надеюсь это поможет!
источник
dataType: 'JSON'
jQuery попытается проанализировать ответ как JSON и выдаст ошибку, если он не является допустимым JSON.dataType: 'json'
для возвращаемого типа и не требуется отправлять массив в Action.contentType: "application/json; charset=utf-8"
, это один, но в некоторых случаях, как это не требуется.var postData = { id: 45, [{myClassProp1: 1, myClassProp2: 2}, {}...], anotherParam: "some string" };
К вашему сведению: JQuery изменил способ сериализации почтовых данных.
http://forum.jquery.com/topic/nested-param-serialization
Вы должны установить для параметра «Традиционный» значение true, в противном случае
выйдет как
вместо того
источник
$.ajax({ ..., traditional: true});
поможет вернуться к традиционной сериализации.ints
. Когда я используюtraditional: true
, это работает, ваш ответ и ссылка объясняет, почему это так. Это также работает, когда я используюtype: "POST"
, без использованияtraditional: true
. Это почему? Не могли бы вы уточнить. К вашему сведению, я использую Asp.Net Mvc.Спасибо всем за ответы. Другим быстрым решением будет использование метода jQuery.param с традиционным параметром, установленным в true, для преобразования объекта JSON в строку:
источник
Не размещайте данные в виде массива. Для привязки к списку пары ключ / значение должны быть представлены с одинаковым значением для каждого ключа.
Вам не нужна форма для этого. Вам просто нужен список пар ключ / значение, которые вы можете включить в вызов $ .post.
источник
В
.NET4.5
,MVC 5
Javascript:
объект в JS:
механизм, который делает сообщение.
C #
Объекты:
контроллер:
Объект получен:
Надеюсь, это сэкономит вам время.
источник
Еще одна реализация, которая также работает со списком объектов, а не только со строками:
JS:
Предполагая, что selectedValues является массивом объектов.
В контроллере параметр представляет собой список соответствующих ViewModels.
источник
Как я уже говорил здесь ,
если вы хотите передать пользовательский объект JSON в действие MVC, то вы можете использовать это решение, оно работает как шарм.
Реальное преимущество этого решения состоит в том, что вам не требуется определять новый класс для каждой комбинации аргументов, а кроме этого вы можете легко приводить ваши объекты к их исходным типам.
Вы можете использовать такой вспомогательный метод, чтобы облегчить вашу работу:
источник
Вы можете установить глобальный параметр с
источник
Ответ мне очень помог в моей ситуации, поэтому спасибо за это. Однако для дальнейшего использования люди должны связать модель и затем подтвердить ее. Этот пост от Фила Хаака описывает это для MVC 2. http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx
Надеюсь, это кому-нибудь поможет.
источник