2009-06-16 1 views
6

Если вы сериализуете форму, используя что-то вроде jQuery, она часто отображает ключи и значения JSON для свойств объекта в действии Controller, которое вы отправляете. Итак:Отправка нескольких элементов в контроллер MVC через jQuery.Ajax

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 
} 

POST:

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 
+0

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

+0

Готово. Последний пример - это сообщение, которое я пытаюсь сделать. – Damien

ответ

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

ОБНОВЛЕНО:

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

Контроллер:

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

Заказчик:

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

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

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

так: $ (». AdditionalParams') элементы должны иметь "идентификатор" и/или«имя "атрибуты, как: TheWeirdQueryString [1], TheWeirdQueryString [2] ... TheWeirdQueryString [N]

Надеется, что это помогает

+0

Результат jquery получает объект JSON. Мои ссылки были, потому что я думал, что {} для данных создал объект JSON? 1-й пример не работает. Он просто добавляет эти параметры к первому объекту, где мне нужно, чтобы все параметры находились в строке как один параметр. Второй пример работает, если я использую Request.QueryString. – Damien

+0

Первый пример должен работать тоже - вы пробовали ?: var extraParam = Form ["extraParam"]; –

+0

Я попробовал var content = $ ('.pngParam'). Serialize()? Является ли форма ["дополнительныйParam"] другой? – Damien

0

данных являются объектом

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

Да, проблема с этим была в том, что он рассмотрит свойство x объекта, как во втором примере. Который, я думаю, прикручивает отображение ключей к свойствам на MVC. – Damien

+0

возможно, вместо использования serialize(), используя formSerialize() из этого плагина http://malsup.com/jquery/form/ –

0

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

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

$ (»additionalParams.) Сериализации()::

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

Client.

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

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

+0

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

Смежные вопросы