Можете ли вы преобразовать словарь C # в ассоциативный массив Javascript, используя asp.net mvc Json () - PullRequest
13 голосов
/ 05 сентября 2010

Я недавно задал этот вопрос , но после некоторых ответов и некоторых исследований я хотел изменить то, что на самом деле спрашивал.

Я видел числосообщения в блоге об отправке ассоциативных массивов из javascript в действие контроллера C # , но я хочу обратного.Я хочу вернуть json клиенту в качестве словаря (из моего исследования javascript-эквивалент словаря является ассоциативным массивом).

, когда я беру обычный словарь на языке c sharp и вызываю Json () и пытаюсьчтобы вернуть его в javascript, он просто взрывается, и я не могу даже поставить точку останова на стороне javascript.Например:

C # Код:

  Dictionary<string, List<CalendarEvent>> dict = events.GroupBy(r => r.Date.ToString("MMM dd, yyyy")).ToDictionary(group => group.Key, group => group.ToList());

    return Json(new
       {
         Dict = dict
       }
    });

Код Javascript:

    $.post('/MyController/Refresh', function (data) {

           var calendarDictionary = data.Dict;

    }, "json");

Ответы [ 4 ]

11 голосов
/ 05 сентября 2010

Вы, возможно, могли бы быть немного более конкретным в отношении , который просто взрывает часть, но вот пример, который отлично работает для меня:

Модель:

public class CalendarEvent
{
    public string Name { get; set; }
    public DateTime Date { get; set; }
    public int Id { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Refresh()
    {
        var model = new[]
        {
            new CalendarEvent 
            {
                Id = 1,
                Name = "event 1",
                Date = DateTime.Now
            },
            new CalendarEvent 
            {
                Id = 2,
                Name = "event 2",
                Date = DateTime.Now
            },
            new CalendarEvent 
            {
                Id = 3,
                Name = "event 3",
                Date = DateTime.Now.AddDays(2)
            },
        }
        .ToList()
        .ConvertAll(a => new
        {
            a.Name,
            a.Id,
            Date = a.Date.ToString("MMM dd, yyyy"),
        })
        .GroupBy(r => r.Date)
        .ToDictionary(
            group => group.Key, 
            group => group.Select(x => new { x.Name, x.Id })
        );
        return Json(new { Dict = model });
    }
}

Просмотр:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>    
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>JSON Test</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    <script type="text/javascript">
    $(function () {
        $.post('/home/refresh', function(data) {
            // TODO : manipulate the data.Dict here
        }, 'json');
    });
    </script>
</head>
<body>

</body>
</html>

Возвращено JSON:

{ "Dict": { "Sep 05, 2010": [ { "Name": "event 1", "Id": 1 },
                              { "Name": "event 2", "Id": 2 } ],
            "Sep 07, 2010": [ { "Name": "event 3", "Id": 3 } ] } }
2 голосов
/ 05 сентября 2010

Возможно, вы захотите взглянуть на библиотеку Json.NET . Это делает создание JSON-представлений объектов .Net очень простым.

2 голосов
/ 05 сентября 2010

В json у вас есть две основные структуры: «массив», это список элементов, и «объект», группа пар ключ-значение.

Так что для того, что вы хотите достичь, метод json должен вернуть объект json (отладьте на стороне сервера, чтобы увидеть, что на самом деле отправляется клиенту).

В javascript объект json будет напрямую отображен на объект javascript, а в javascript объекты также являются ассоциативными массивами

Итак, подведем итог:

Убедитесь, что сервер возвращает объект json, тогда вы можете использовать его как некоторый словарь в javascript.

0 голосов
/ 05 сентября 2010

Ваш код недействителен - возможно, опечатка?

$.post('/MyController/Refresh', function (data) {

           var calendarDictionary = data.Dict;

    }, "json");

Кроме того, я видел случаи, когда методу требуется параметр данных, даже если он пуст {{.* Наконец, json должен вернуться внутрь data.d - используйте firebug для console.log ответа.

...