Прямо сейчас вы отправляете строку JSON в виде всего тела вашего POST. MVC не имеет возможности соединить точки и понять, что вы хотели, чтобы он предоставил всю строку в качестве параметра с именем myString.
Для этого измените ваш параметр данных на стороне клиента следующим образом:
$.ajax({
url: '/Home/Request',
type: 'POST',
dataType: 'json',
data: { myString: jsonData },
contentType: 'application/json; charset=utf-8',
success: function (x) {
// If ParseResult is some sort of JSON deserializing, don't do that.
// When the dataType is set to 'json', jQuery handles this for you
// automatically before the success handler is called.
self.ParseResult(x);
}
});
Когда вы предоставляете jQuery объект в качестве параметра данных, он автоматически URLE кодирует его перед отправкой, поэтому что-то подобное будет отправлено на сервер:
myString={json:data, here:etc}
MVC выберет его в качестве параметра myString, как вам нужно, и вы можете приступить к десериализации его с помощью JavaScriptSerializer.
Кроме того, если вы не делаете что-то более сложное на стороне клиента, чем показываете, класс JavaScript не нужен. Примерно так будет работать:
var testData2 = {
MyInt: 5678,
MyString: "GHIjkl",
}
var testData1 = {
MyInt: 1234,
MyString: "abcDEF",
Subs: [ testData2 ]
}
Все это говорит, почему вы используете JSON для запроса? Если вы принимаете параметр пользовательского типа в своем действии, связыватель модели MVC довольно хорошо справляется с увлажнением этого типа из стандартных входных данных с кодировкой URLE:
public JsonResult Data(MyClass request)
{
// request.MyInt, request.MyString, etc should exist here.
var answer = ...
// It's okay to accept URLEncoded input parameters, but still return JSON.
return Json(answer, JsonRequestBehavior.DenyGet);
}
Тогда для его вызова не требуется сериализация JSON на стороне клиента:
var testData2 = {
MyInt: 5678,
MyString: "GHIjkl",
}
var testData1 = {
MyInt: 1234,
MyString: "abcDEF",
Subs: [ testData2 ]
}
$.ajax({
url: '/Home/Request',
type: 'POST',
traditional: true,
dataType: 'json',
data: testData1
success: function (x) {
self.ParseResult(x);
}
});
Все немного проще и быстрее, так как вы удалили слой сериализации на стороне клиента и десериализации на стороне сервера.