Как опубликовать параметры списка выбора в метод действия MVC? - PullRequest
1 голос
/ 26 июля 2011

Я пытаюсь отправить все элементы списка выбора в метод действия MVC 3.Вот мой метод действия:

[HttpPost]
public ActionResult SaveList(int SettingID, List<SelectListItem> items)
{
    // blah...
}

, а вот упрощенная версия того, как я пытаюсь отправить данные:

var items = $("#listItems > option").map(function ()
{
    var arr = [];
    arr.push({ Value: $(this).val(), Text: $(this).text() });
    return arr;
}).get();

$.ajax({
    type: "POST",
    url: "/CompanyAdmin/SaveSettingList/",
    dataType: 'json',
    data: { items: items, SettingID: SettingID},
    success: function (msg)
    {
        alert(msg);
    }
});

Параметр идентификатора настройки заполняется правильно.И список заполняется правильной суммой элементов, но свойства Text и Value имеют значение null.

Нужно ли устанавливать один из плагинов JSON для jQuery, чтобы иметь возможность отправлять массивitems?

РЕДАКТИРОВАТЬ 1:

Следуя совету Дарина Димитрова, я использовал метод stringify и отправил и SettingID, и список параметров в виде JSON.

Сначала это не затрагивало мой метод Action, поэтому я изменил метод на следующий:

public ActionResult SaveList(SaveSettingListModel json)
{}

с параметром, определяемым так: (для соответствия JSON)

public class SaveSettingListModel
{
    public int SettingID { get; set; }
    public List<SelectListItem> items { get; set; }
}

Это теперь запускает правильный метод. Однако , содержимое json на стороне сервера: SettingID = 0 (когда я убедился, что это 2 на стороне клиента), и items = null.

Ответы [ 2 ]

5 голосов
/ 26 июля 2011

Попробуйте опубликовать их как JSON.

Начните с определения модели представления:

public class MyViewModel
{
    public int SettingID { get; set; }
    public List<SelectListItem> Items { get; set; }
}

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

[HttpPost]
public ActionResult SaveList(MyViewModel model)
{
    // blah...
}

и, наконец, в вашем скрипте:

var items = $('#listItems > option').map(function ()
{
    var arr = [];
    arr.push({ value: $(this).val(), text: $(this).text() });
    return arr;
}).get();

$.ajax({
    type: 'POST',
    url: '/CompanyAdmin/SaveSettingList/', // <-- use an URL Helper to generate this url instead of hardcoding it or you will cry when you deploy your application into a virtual directory
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({ 
        items: items, 
        settingID: SettingID 
    }),
    success: function (msg) {
        alert(msg);
    }
});

И если вы хотите использовать метод JSON.stringify в старых браузерах, в которых он не поддерживается изначально, убедитесь, что вы включили json2.js script.

Все это, как говорится, я вижу, куда вы идете с этим действием контроллера и с этим запросом AJAX, и я должен сказать, что я не буду делать это таким образом (отправьте опции в запросе).Я имею в виду, чтобы сделать это представление, вы взяли этот список откуда-то?Предположительно, хранилище данных?Поэтому вместо того, чтобы бороться с HTML <form> (который отправляет на сервер только выбранное значение раскрывающегося списка при отправке), почему бы вам просто не использовать это же хранилище данных в действии SaveList, чтобы получить эти самыетакие же варианты?Это позволит вам избежать их обхода и сэкономит пропускную способность.Не волнуйтесь, базы данных работают быстро.А если их нет, просто кешируйте результаты дорогих запросов.

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

0 голосов
/ 26 июля 2011

Взгляните на это, оно поможет вам в этом случае.

http://community.codesmithtools.com/CodeSmith_Community/b/tdupont/archive/2009/08/10/mvc-custom-json-binder.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...