2010-09-05 27 views
13

Hace poco asked this question, pero después de algunas de las respuestas y algunas investigaciones, quise cambiar lo que realmente estaba preguntando.¿Puede convertir el diccionario C# a una matriz asociativa de Javascript utilizando asp.net mvc Json()

he visto una acción del controlador number of blog posts about sending associative arrays from javascript to C# pero quiero todo lo contrario. Quiero devolver json a un cliente como un diccionario (de mi investigación el equivalente de Javascript del diccionario es una matriz asociativa).

cuando tomo un diccionario normal en c sharp y llamo a Json() y trato de devolverlo a javascript, simplemente explota y no puedo ni siquiera poner un punto de interrupción en el lado de javascript. Por ejemplo:

C# Código:

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 
     } 
    }); 

Código Javascript:

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

      var calendarDictionary = data.Dict; 

    }, "json"); 

Respuesta

11

Probablemente podría haber sido un poco más específica sobre el sólo explota parte, pero aquí está un ejemplo que funciona bien para mí:

Modelo:

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

controlador:

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 }); 
    } 
} 

Ver:

<%@ 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> 

devolverán como JSON:

{ "Dict": { "Sep 05, 2010": [ { "Name": "event 1", "Id": 1 }, 
           { "Name": "event 2", "Id": 2 } ], 
      "Sep 07, 2010": [ { "Name": "event 3", "Id": 3 } ] } } 
2

En JSON tiene dos estructuras principales: una "matriz", esta es una lista de elementos, y un " objeto ", un grupo de pares clave-valor.

Así que para lo que quiere lograr el método json tiene que devolver un objeto json (depurar el lado del servidor para ver lo que realmente se envía al cliente).

en JavaScript se asignará directamente el objeto JSON a un objeto de javascript, y en javascript objects are also associative arrays

Entonces, para resumir:

Asegúrese de que el servidor devuelve un objeto JSON, entonces se puede usar como algunos tipo de diccionario en javascript.

0

Su código no es válido, ¿quizás un error tipográfico?

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

      var calendarDictionary = data.Dict; 

    }, "json"); 

Además, he visto casos en los que un método necesita el parámetro de datos, incluso si está vacío {}.

Finalmente, el json debe regresar a los datos.d - use firebug para console.log la respuesta.

+0

sí, eso fue solo un error en mi publicación. He corregido – leora

+0

¿cuál es el voto negativo? Por favor explique. – ScottE

2

Es posible que desee ver en la biblioteca Json.NET. Hace que la creación de representaciones JSON de objetos .Net sea muy simple.

Cuestiones relacionadas