Отправка нескольких элементов в контроллер MVC через jQuery.Ajax

Если вы сериализуете форму с помощью чего-то вроде jQuery, он часто сопоставляет ключи и значения JSON со свойствами объекта в действии контроллера, в которое вы отправляете сообщения. Так:

jQuery:

function PostForm() {
    $.ajax({
        url: "/Home/TestMVC",
        type: "POST",
        dataType: "application/JSON",
        data:  $('#form').serialize(),
        complete: callFunction
        }
    });

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

Действие:

public void TestMVC(MyObject obj)
{
//Obj should now contain the data from the serialised form
}

ПОЧТА:

Name: "Bob"
Age: "999"
Sex: "Unknown"

Кто-нибудь знает, как это работает? Он ломается каждый раз, когда я передаю форму и любые дополнительные данные контроллеру.

Я хотел бы отправить содержимое данных, а также QueryString, который может содержать любое количество и типы пар ключ/значение в контроллер. Я могу извлечь эти пары ключ/значение на сервере, так как не могу создать для них объект в сигнатуре метода. Однако это не работает должным образом.

jQuery:

function PostForm() {

    $.ajax({
        url: "/Home/TestMVC",
        type: "POST",
        dataType: "application/JSON",
        data: 
        { 
           Obj: $('#form').serialize(),
           TheWeirdQueryString: $('.additionalParams').serialize(),
        }
    });
};

Действие:

public void TestMVC(MyObject obj, String TheWeirdQueryString)
{
//Obj now does NOT contain the element, it is NULL. Whereas TheWeirdQueryString works fine. 
}

Почта:

Obj: name=bob&age=999&sex="unknown"
TheWeirdQueryString: param1=1&param2=2

Я думаю, это потому, что я фактически создал объект JSON в качестве данных и установил свойства для имени объекта.

Существует разница в значениях POST, которые появляются в Firebug. Когда я отправляю только объект, значения POST — это все ключи объекта/формы с соответствующими значениями. Во втором примере есть два простых свойства: имя, которое я им дал, каждое из которых содержит QueryString (Foo=1&Bar=2), и MVC не может сопоставить QueryString с элементами объекта (или так может выглядеть).

Можно ли вообще работать так, как в первом случае, а также отправлять дополнительные данные во второй аргумент действия? Я предполагаю, что нужно добавить дополнительное свойство ко всем существующим, созданным, когда jquery выполняет сериализацию формы.

POST, который я действительно хочу, это:

Name: "Bob"
Age: "999"
Sex: "Unknown"
TheWeirdQueryString: param1=1&param2=2

person Damien    schedule 16.06.2009    source источник
comment
Можете ли вы опубликовать значения POST, которые вы видите для обоих сценариев? Я не совсем понимаю ваше описание.   -  person John G    schedule 16.06.2009
comment
Сделанный. Последний пример — это пост, который я пытаюсь сделать.   -  person Damien    schedule 16.06.2009


Ответы (3)


Параметр dataType в методе $.ajax — это тип ответа (тип данных, которые вы ожидаете получить от сервера), а не запрос. Попробуйте это вместо этого:

function PostForm() {
    $.ajax({
        url: "/Home/TestMVC",
        type: "POST",
        dataType: "application/JSON",
        data: $('#form').serialize() + "&" + $('.additionalParams').serialize()
    });
};

or:

function PostForm() {
    $.ajax({
        url: "/Home/TestMVC" + "?" + $('.additionalParams').serialize(),
        type: "POST",
        dataType: "application/JSON",
        data: $('#form').serialize()
    });
};

ОБНОВЛЕНО:

Попробуй это:

Контроллер:

public void TestMVC(MyObject obj, String[] TheWeirdQueryString)
{
}

Клиент:

function PostForm() {
    $.ajax({
        url: "/Home/TestMVC",
        type: "POST",
        dataType: "application/JSON",
        data: $('#form').serialize() + "&" + $('.additionalParams').serialize()
    });
};

но на стороне клиента ваши дополнительные параметры должны быть в следующем формате:

TheWeirdQueryString[0]=param1&TheWeirdQueryString[1]=param2&...&TheWeirdQueryString[n]=paramN

поэтому элементы $('.additionalParams') должны иметь атрибуты "id" и/или "name", такие как: TheWeirdQueryString[1], TheWeirdQueryString[2] ... TheWeirdQueryString[N]

Надеюсь это поможет

person eu-ge-ne    schedule 16.06.2009
comment
Результат jquery получает объект JSON. Мои ссылки были потому, что я думал, что {} для данных создал объект JSON? 1-й пример не работает. Он просто добавляет эти параметры к первому объекту, где мне нужно, чтобы все параметры были в строке как один параметр. Второй пример работает, если я использую Request.QueryString. - person Damien; 16.06.2009
comment
Первый пример тоже должен работать — вы пробовали?: var AdditionalParam = Form[additionalParam]; - person eu-ge-ne; 16.06.2009
comment
Я пробовал var content = $('.additionalParam').serialize()? Отличается ли форма[additionalParam]? - person Damien; 16.06.2009
comment
Хорошее решение, я все равно проголосовал за вас за первое, так как оно работает. Новый, который вы разместили, не будет работать, так как мне нужно имя ключа (т. е. идентификатор/имя элемента), чтобы выполнить его обработку. (Я превращаю его в словарь пар ключ/значение) - person Damien; 16.06.2009

Данные — это объект

...
data: { 
    x :$('#form').serialize(), 
    y:'something else'
}
...
person Elzo Valugi    schedule 16.06.2009
comment
Да, проблема заключалась в том, что он считал x свойством объекта, как во втором примере. Что, я думаю, портит сопоставление ключей со свойствами в MVC. - person Damien; 16.06.2009
comment
возможно, вместо использования serialize() используйте formSerialize() из этого плагина malsup.com/jquery/form - person Elzo Valugi; 16.06.2009

Другое решение, если вам нужен словарь пар ключ/значение:

public void TestMVC(MyObject obj, IDictionary<string, object> TheWeirdQueryString)
{
}

Клиент:

function PostForm() {
    $.ajax({
        url: "/Home/TestMVC",
        type: "POST",
        dataType: "application/JSON",
        data: $('#form').serialize() + "&" + $('.additionalParams').serialize()
    });
};

Формат $('.additionalParams').serialize():

TheWeirdQueryString[0].Key=param0&TheWeirdQueryString[0].Value=value0&TheWeirdQueryString[1].Key=param1&TheWeirdQueryString[1].Value=value1&...&TheWeirdQueryString[n].Key=paramN&TheWeirdQueryString[n].Value=valueN

ОБНОВЛЕНО:

Вам нужно что-то вроде этого:

<input class="additionalParams" type="text" name="TheWeirdQueryString[0].Key" value="param0" />
<input class="additionalParams"type="text" name="TheWeirdQueryString[0].Value" value="value0" />
<!-- ... -->
<input class="additionalParams"type="text" name="TheWeirdQueryString[n].Key" value="paramN" />
<input class="additionalParams"type="text" name="TheWeirdQueryString[n].Value" value="valueN" />
person eu-ge-ne    schedule 16.06.2009
comment
Это то, каким должен быть формат POST, или мне нужно сделать формат самостоятельно. Он продолжает делать ключ: значение ключ: значение вместо того, что вы опубликовали - person Damien; 17.06.2009