Если вы сериализуете форму, используя что-то вроде 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
}
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¶m2=2
Я думаю, это потому, что я на самом деле создал объект JSON в качестве данных и установил в свойствах имя объекта.
Существует разница в значениях POST, которые появляются в Firebug. Когда я публикую один объект, значения POST - это все ключи объекта / формы с соответствующими значениями. Во втором примере есть два простых свойства: имя, которое я им дал, каждое из которых содержит QueryString (Foo=1&Bar=2
), а MVC не может сопоставить QueryString с элементами объекта (или так оно и будет).
Есть ли вообще возможность работать так, как в первом случае, но также отправлять дополнительные данные второму аргументу в действии? Я предполагаю, что это добавить дополнительное свойство ко всем существующим, созданным, когда jquery выполняет сериализацию формы.
Почта, которую я на самом деле хочу:
Name: "Bob"
Age: "999"
Sex: "Unknown"
TheWeirdQueryString: param1=1¶m2=2