6

Вопрос по json, asp.net-mvc, jquery – Отправка нескольких элементов в контроллер 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"

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

Я хотел бы отправить содержимое данных, а также 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 выполняет сериализацию формы.

ПОЧТА, которую я на самом деле хочу, это:

Name: "Bob"
Age: "999"
Sex: "Unknown"
TheWeirdQueryString: param1=1&param2=2
  • Error: User Rate Limit Exceeded

    от Damien
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Damien
  • Error: User Rate Limit Exceeded

    от Damien
  • Error: User Rate Limit Exceededmalsup.com/jquery/form

    от
  • Error: User Rate Limit Exceeded

    от Damien
  • Это то, что формат POST должен быть или мне нужно сделать формат самостоятельно. Он продолжает делать ключ: значение ключ: значение вместо того, что вы опубликовали

    от Damien
  • Я добавил пример разметки HTML

    от
  • Можете ли вы опубликовать значения POST, которые вы видите для обоих сценариев? Я не совсем понимаю ваше описание.

    от John G
  • Готово. Последний пример - Пост, который я пытаюсь сделать.

    от Damien
  • 0

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

    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()
        });
    };
    

    Формат $ ('.additionParams'). 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
    

    UPDATED:

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

    <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" />
    

  • 0

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

    ...
    data: { 
        x :$('#form').serialize(), 
        y:'something else'
    }
    ...
    

  • 5

    Параметр dataType в методе $ .ajax - это тип ответа (тип данных

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

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

    или же:

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

    UPDATED:

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

    контроллер:

    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") должны иметь "идентификатор". и / или «имя» такие атрибуты, как: TheWeirdQueryString [1], TheWeirdQueryString [2] ... TheWeirdQueryString [N]

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