Итак, вопрос в том, могу ли я использовать что-то в ASP.NET MVC, чтобы это работало
с javascripts в формате источника, или я делаю это с нуля неправильно?
Класс DataContractJsonSerializer
довольно строг с точки зрения формата JSON и соответствует спецификации. Например:
{account:"123", page:"item"}
является недействительным JSON в соответствии со спецификацией. Вы должны поставить двойные кавычки вокруг имен свойств. Вы можете использовать JSON.stringify
, чтобы получить действительный JSON:
var p = { account:'123', page:'item' };
var message = JSON.stringify(p);
, который выдаст {"account":"123","page":"item"}
, который теперь является действительным JSON. Функция JSON.stringify
изначально встроена в современные браузеры, и если вы хотите поддерживать устаревшие браузеры, вы можете включить json2.js на свою страницу.
При этом вы можете использовать менее строгий JavaScriptSerializer класс или Json.NET , который примет вашу недопустимую строку JSON:
public class MyModel
{
public string Account { get; set; }
public string Page { get; set; }
}
class Program
{
static void Main()
{
var json = "{account:\"123\", page:\"item\"}";
var serializer = new JavaScriptSerializer();
var model = serializer.Deserialize<MyModel>(json);
Console.WriteLine("account = {0}, page = {1}", model.Account, model.Page);
}
}
И как говорится, я не знаю, почему вы десериализуете JSON вручную вместо того, чтобы полагаться на встроенный JsonValueProviderFactory :
[HttpPost]
public ActionResult MyAction(MyModel model)
{
...
}
и для вызова из JavaScript с использованием AJAX:
$.ajax({
url: '@Url.Action("MyAction", "Home")',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({ account: "123", page: "item" }),
success: function(result) {
// TODO: process the results
}
});
Видите, теперь вам больше не нужно беспокоиться о какой-либо ручной сериализации / десериализации. Все обрабатывается фреймворком для вас.