Этот ответ является продолжением ответа DaRKoN_, в котором использовался объектный фильтр:
[ObjectFilter(Param = "postdata", RootType = typeof(ObjectToSerializeTo))]
public JsonResult ControllerMethod(ObjectToSerializeTo postdata) { ... }
У меня была проблема с выяснением, как отправить несколько параметров в метод действия, и чтобы один из них был объектом json, а другой - простой строкой. Я новичок в MVC, и я только что забыл, что я уже решил эту проблему с не-ajaxed представлениями.
Что бы я сделал, если бы мне понадобились, скажем, два разных объекта на виде. Я хотел бы создать класс ViewModel. Скажем, мне нужен объект person и объект address, я бы сделал следующее:
public class SomeViewModel()
{
public Person Person { get; set; }
public Address Address { get; set; }
}
Тогда я бы привязал представление к SomeViewModel. Вы можете сделать то же самое с JSON.
[ObjectFilter(Param = "jsonViewModel", RootType = typeof(JsonViewModel))] // Don't forget to add the object filter class in DaRKoN_'s answer.
public JsonResult doJsonStuff(JsonViewModel jsonViewModel)
{
Person p = jsonViewModel.Person;
Address a = jsonViewModel.Address;
// Do stuff
jsonViewModel.Person = p;
jsonViewModel.Address = a;
return Json(jsonViewModel);
}
Тогда в представлении вы можете использовать простой вызов с JQuery, например:
var json = {
Person: { Name: "John Doe", Sex: "Male", Age: 23 },
Address: { Street: "123 fk st.", City: "Redmond", State: "Washington" }
};
$.ajax({
url: 'home/doJsonStuff',
type: 'POST',
contentType: 'application/json',
dataType: 'json',
data: JSON.stringify(json), //You'll need to reference json2.js
success: function (response)
{
var person = response.Person;
var address = response.Address;
}
});