MVC3 Несовместимое поведение JSON / DateTime между JsonResult и JsonValueProviderFactory? - PullRequest
1 голос
/ 15 июня 2011

Я недавно обновил один из моих проектов с MVC2 до MVC3 и соответственно скорректировал некоторый код.Одна проблема, с которой я столкнулся, - это проблема JSON и DateTime.

У меня очень простой код для демонстрации, идея очень проста, что я возвращаю JSON из контроллера, клиентский JavaScript получает как есть и отправляет обратно в другой метод действия для сравнения данных.

Моя модель представления, используемая в качестве контейнера данных:

public class JsonViewModel {
    public int IntegerValue {
        get;
        set;
    }

    public string StringValue {
        get;
        set;
    }

    public DateTime DateTimeValue {
        get;
        set;
    }
}

У меня есть контроллер с двумя методами действия, один для генерации данных JSON и один для получения данных JSON:

public class HomeController : Controller {
    [HttpPost]
    public JsonResult GetJsonData() {
        JsonViewModel data = new JsonViewModel
        {
            IntegerValue = 99,
            StringValue = "This is test string",
            DateTimeValue = DateTime.Now
        };

        return new JsonResult { ContentEncoding = Encoding.UTF8, Data = data };
    }

    [HttpPost]
    public ActionResult ReceiveJsonData(JsonViewModel data) {
        return View(data);
    }
}

ПредставлениеКод также очень прост:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<SomeClass>" %>
<!DOCTYPE html>
<html>
<head runat="server">
<link type="text/css" href="<%: Url.Content("~/Content/site1.css") %>" rel="stylesheet" />
<link type="text/css" href="<%: Url.Content("~/Content/themes/base/jquery.ui.all.css") %>" rel="stylesheet" />
<script type="text/javascript" src="<%: Url.Content("~/Scripts/jquery-1.5.1.js") %>"></script>
<script type="text/javascript" src="<%: Url.Content("~/Scripts/jquery.validate.js") %>"></script>
<script type="text/javascript" src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.js") %>"></script>
<script type="text/javascript" src="<%: Url.Content("~/Scripts/jquery-ui-1.8.11.js") %>"></script>
</head>
<body>
<input type="button" value="JSON Test" id="btnJson" />
<script>
    $(document).ready(function () {
        $('#btnJson').click(function () {
            $.ajax({
                type: "Post",
                url: "/Home/GetJsonData/",
                dataType: "json",
                error: function (request, error) {
                    alert("readyState: " + request.readyState + "\nstatus: " + request.status);
                    alert("responseText: " + request.responseText);
                },
                success: function (data) {
                    var jsonData = JSON.stringify(data);
                    $.ajax({
                        type: "POST",
                        contentType: "application/json; charset=utf-8",
                        url: "/Home/ReceiveJsonData/",
                        cache: false,
                        data: jsonData,
                        dataType: "html",
                        success: function (result) {
                            //alert(result);
                        },
                        error: function (request) {
                            alert("readyState: " + request.readyState + "\nstatus: " + request.status);
                            alert("responseText: " + request.responseText);
                        }
                    });
                }
            });
        });
    });
</script>
</body>
</html>

Я ожидаю, что объект, генерируемый и ищущий в GetJsonData методе действия, должен быть таким же, как ReceiveJsonData метод действия.Но фактическое поведение состоит в том, что целочисленные и строковые значения сохраняются, но datetime значение сбрасывается.

Любая подсказка, почему?

Ответы [ 3 ]

4 голосов
/ 21 июня 2011

Или вы можете сделать что-то вроде этого:

var jsonData = JSON.stringify(data).replace(/\/Date\(\d+\)/g, function (a) { return '\\' + a + '\\'; });

И это должно работать как шарм.

2 голосов
/ 17 июня 2011

У меня та же проблема.Во время тестов я понял, что JSON.stringify удаляет "\" из "\ / Date (xxxxx) \ /" и MVC не может десериализовать его.Решение состоит в том, чтобы обеспечить другой тип сериализации DateTime.Вместо того, чтобы возвращать JsonResult, я делаю что-то вроде этого: var json = JsonConvert.ExportToString(data); return Content(json,"application/json");

JsonConvert - это класс библиотеки Jayrock.Он хранит значения DateTime в формате XML, который понятен для MVC.Надеюсь, это поможет

0 голосов
/ 26 марта 2012

Я получил ответ от http://forums.asp.net/t/1689952.aspx/1, который мне идеально подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...