AJAX & ASP.NET MVC 3: как передать строковый параметр и массив одновременно в контроллер - PullRequest
4 голосов
/ 26 августа 2011

У меня есть следующая подпись контроллера:

public void DoSomething(string dialerJob, MyViewModel[] agentStates)

ViewModels представляют поля формы в массиве (выбранные элементы в таблице HTML). Я выяснил, как передать элемент формы int в качестве аргумента массива в контроллер благодаря плагину jQuery Роберта Коритника (.toDictionary ()) (http://erraticdev.blogspot.com/2010/12/sending-complex-json-objects-to-aspnet.html).

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

 var job = $('#DialerJobs').attr('value');
 var data1 = $.toDictionary(data, "agentStates");

 $.ajax({
   url: "/Blending/ChangeOutboundJob",
   type: "POST",
   dataType: "application/JSON",
   data: {job, data1}
 });

Я также попробовал следующее:

 var job = $('#DialerJobs').attr('value');
 var data1 = $.toDictionary(data, "agentStates");

 $.ajax({
   url: "/Blending/ChangeOutboundJob",
   type: "POST",
   dataType: "application/JSON",
   data: {dialerJob: job, agentStates: data1}
 });

Но ни одна из них не работает.

Если я удаляю параметр dialerJob из данных для отправки, агентские состояния правильно заполнятся в контроллере. И то, что отправляется, выглядит так:

agentStates[0].agentId=7654&agentStates[0].projectId=999&agentStates[0].stateId=1&agentStates

[0] .subStateId = 1 & agentStates [1] .agentId = 9876 & agentStates [1] .projectId = 999 & agentStates * +1018 *

[1] .stateId = 1 & agentStates [1] .subStateId = 1

Но если я включил dialerJob, то получим следующее:

dialerJob=SomeJob&agentStates[0][name]=[0].agentId&agentStates[0][value]=84&agentStates[1][name]=

[0] .projectId & agentStates [1] [значение] = 999 & agentStates [2] [имя] = [0] .stateId & agentStates [2] [значение] * * тысяче двадцать-пять

= 1 & agentStates [3] [имя] = [0] .subStateId & agentStates [3] [значение] = 1 & agentStates [4] [имя] = [1] .agentId & agentStates * * тысяча двадцать семь * 1 028 * [4] [значение] = 15884 & agentStates [5] [имя] = [1] .projectId & agentStates [5] [значение] = 999 & agentStates [6] [имя] = [1] .stateId & agentStates [6] [значение] = 1 & agentStates [7] [имя] = [1] .subStateId & agentStates [7] [значение] = 1

Что все запутано ...

Ответы [ 2 ]

8 голосов
/ 26 августа 2011

Вы можете использовать JSON-запрос:

$.ajax({
    url: '@Url.Action("ChangeOutboundJob", "Blending")',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({ 
        dialerJob: 'job', 
        agentStates: [
            { property1: 'value 1', property2: 'value 2' }, 
            { property1: 'value 3', property2: 'value 4' } 
        ] 
    }),
    success: function (result) {
        // TODO: process the results
    }
});

Это успешно отобразит следующее действие контроллера:

public void DoSomething(string dialerJob, MyViewModel[] agentStates)

, где MyViewModel определяется следующим образом:

public class MyViewModel
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

Примечание: метод JSON.stringify изначально встроен во все современные браузеры. Если вам нужна поддержка устаревших браузеров, вам необходимо включить скрипт json2.js на свою страницу.

0 голосов
/ 26 августа 2011

измените js job var, чтобы он назывался dialerJob, имена должны совпадать, чтобы маппер автоматически отображал их.

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