Отправить JSON-данные в круговую диаграмму из контроллера MVC asp.net в C # - PullRequest
6 голосов
/ 06 июня 2011

Я хочу отправить данные json с моего контроллера MVC asp.net в C # и использовать эти данные для построения круговой диаграммы старших графиков.

Итак, на данный момент я использую это:

Dictionary<string, double> result = new Dictionary<string, double>();
result.Add("test1", 45);
result.Add("test2", 64);

var jsonResult = Json(new
{
    graphDivId = "divGraph",
    legend = "A legend",
    stats = result ,
});

jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return jsonResult;

но когда я получил данные с помощью ajax-вызова в jquery, у меня есть это:

stats:[{"Key":"test1","Value":45},{"Key":"test2","Value":64}]

но мне нужно это:

stats:[["test1",45],["test2",64]]

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 06 июня 2011

Этим утром я немного поиграл с этим и придумал то, что у меня есть ниже - но это не сработает, потому что вы получите [{x: "testx", y: 60} ....].Так что это не хорошо.Вы можете использовать его и переопределить метод ToJSON в SimpleClass.

Еще одна мысль, которая у меня была (и я не уверен, что это сработает), - это иметь коллекцию ArrayList.Поскольку ArrayList не являются строго типизированными, вы можете добавить к ним строковое и двойное свойство.

Дайте мне знать, как это получается.

Что делать, если вы использовали список простых объектов.Вы можете использовать пару ключ-значение или какой-либо другой существующий класс.Но вы можете создать простой класс, который будет хранить ваши данные.

   class SimpleClass{
       public int x{set; get;}
       public double y{set; get;}
   } 

    var results = new List<SimpleClass>();
    results.Add(new SimpleClass{x="test3", y=42});        
    results.Add(new SimpleClass{x="test2", y=99});
1 голос
/ 08 июня 2011

Еще одна вещь, которую приятно знать.

highcharts series.data - это точечный объект, который вы можете представить этим в C #:

class HighChartsPoint
{
    public double x {set; get;}
    public double y {set; get;}
    public string color {set; get;}
    //public HighChartsEvent events{set; get;}
    public string id {set; get;}
    //public HighChartsMarker marker {set; get;}
    public string name {set; get;}
    public bool sliced {set; get;}
} 

ссылка: http://www.highcharts.com/ref/#point

ek_ny класс является частью представления точечного объекта. События и маркер комментируются, потому что это еще один класс для записи. Представление об этом есть:

события: http://www.highcharts.com/ref/#point-events

маркер: http://www.highcharts.com/ref/#point-marker

Так что теперь вы можете использовать его так:

var results = new List<HighChartsPoint>();
results.Add(new HighChartsPoint {
          name="test3", 
          y=42, 
          color="red", 
          id="someid", 
          sliced=false 
        });

var jsonResult = Json(results);
jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
return jsonResult;

Надеюсь, это поможет ...

1 голос
/ 06 июня 2011

perfect ek_ny!

Благодаря вашей помощи я нашел способ обойтись и без определенного класса:

var results = new List<List<object>>();
results.Add(new List<object>(new object[]{"test1", 45}));
results.Add(new List<object>(new object[]{"test2", 99}));
0 голосов
/ 03 января 2012

На всякий случай. Высокие диаграммы не могут отображать график, если значение установлено в ноль. И метод Json класса контроллера asp.net mvc не может фильтровать нулевое значение.

Для этого вы можете использовать библиотеку json.net и создать, например, JsonNetResult (наследовать от ActionResult):

public class JsonNetResult : ActionResult
    {

        public Encoding ContentEncoding { get; set; }
        public string ContentType { get; set; }
        public object Data { get; set; }        
        public JsonSerializerSettings SerializerSettings { get; set; }
        public Formatting Formatting { get; set; }

        public JsonNetResult()
        {
            SerializerSettings = new JsonSerializerSettings();
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
                throw new ArgumentNullException("context");
            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = !string.IsNullOrEmpty(ContentType)
              ? ContentType
              : "application/json";

            if (ContentEncoding != null)
                response.ContentEncoding = ContentEncoding;

            if (Data != null)
            {
                JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting };
                JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
                serializer.Serialize(writer, Data);
                writer.Flush();
            }
        }
    }

, а затем добавьте этот метод в свой контроллер, чтобы заменить метод Json asp.net mvc:

protected JsonNetResult JsonNet(object data, bool needDefaultSettings)
        {
            var result = new JsonNetResult();
            result.Data = data;

            if (needDefaultSettings)
            {
                var defaultSettings = new JsonSerializerSettings
                {
                    NullValueHandling = NullValueHandling.Ignore,
                    DefaultValueHandling = DefaultValueHandling.Ignore
                };
                result.SerializerSettings = defaultSettings;
            }

            return result;
        }

Так что теперь вы можете использовать его в своем действии контроллера:

public JsonNetResult MyAction()
{
    MyClass myObject = new MyClass();
    return JsonNet(myObject);
}

Ну и еще, не стесняйтесь использовать атрибут Json.Net DefaultValue в свойствах MyClass:

[DefaultValue(null)]
...