2010-09-05 12 views
13

Ho recentemente asked this question, ma dopo alcune delle risposte e qualche ricerca, volevo cambiare quello che stavo effettivamente chiedendo.Puoi convertire il dizionario C# in array associativo Javascript usando asp.net mvc Json()

ho visto un'azione controller number of blog posts about sending associative arrays from javascript to C# ma voglio il contrario. Voglio restituire json a un client come dizionario (dalla mia ricerca l'equivalente javascript del dizionario è un array associativo).

quando prendo un dizionario normale in c sharp e chiamo Json() su di esso e provo a restituirlo a javascript, esso esplode e non riesco nemmeno a mettere un punto di interruzione sul lato javascript. Per esempio:

C# Codice:

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

codice JavaScript:

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

      var calendarDictionary = data.Dict; 

    }, "json"); 

risposta

11

Probabilmente avrebbe potuto essere un po 'più specifico sulla soffia solo fino parte, ma ecco un esempio che funziona bene per me:

Modello:

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

Controller:

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

Vista:

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

restituito JSON:

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

in JSON avete due strutture principali: un "allineamento", questa è una lista di elementi, e una " oggetto ", un gruppo di coppie chiave-valore.

Quindi, per ciò che si desidera ottenere, il metodo json deve restituire un oggetto json (eseguire il debug sul lato server per vedere cosa viene effettivamente inviato al client).

in javascript l'oggetto JSON verrà mappato direttamente ad un oggetto JavaScript, e in javascript objects are also associative arrays

Quindi, per riassumere:

Assicurarsi che il server restituisce un oggetto JSON, quindi è possibile utilizzarlo come un po ' tipo di dizionario in javascript.

0

Il tuo codice non è valido, forse un refuso?

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

      var calendarDictionary = data.Dict; 

    }, "json"); 

Inoltre, ho visto casi in cui un metodo ha bisogno del parametro data, anche se è vuoto {}.

Infine, il json dovrebbe tornare dentro data.d - usa firebug per console.log la risposta.

+0

sì, quello era solo un errore di battitura nel mio post. ho corretto – leora

+0

a cosa serve il downvote? Spiega per favore. – ScottE

2

Si potrebbe desiderare di guardare in biblioteca Json.NET. Rende molto semplice la creazione di rappresentazioni JSON di oggetti .Net.

Problemi correlati