6

我想用 C# 从我的 asp.net MVC 控制器发送 json 数据,并使用这些数据绘制一个 highcharts 饼图。

所以目前我使用这个:

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;

但是当我在 jquery 中通过 ajax 调用收到数据时,我有这个:

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

但我需要这个:

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

有任何想法吗 ?

4

4 回答 4

3

今天早上我正在玩这个,我想出了下面的内容 - 但它不起作用,因为你会得到 [{x:"testx", y:60}....]。所以这不好。您也许可以使用它并覆盖 SimpleClass 上的 ToJSON 方法。

我的另一个想法(我不确定它是否会起作用)是拥有一个 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});
于 2011-06-06T09:58:59.893 回答
1

完美的 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}));
于 2011-06-06T10:07:13.213 回答
1

另一件事很高兴知道。

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;

希望它有帮助...

于 2011-06-08T08:44:49.337 回答
0

以防万一。如果值设置为 null,Highcharts 无法显示图表。而 asp.net mvc 控制器类的 Json 方法无法过滤空值。

为此,您可以使用 json.net 库并创建例如 JsonNetResult (inherit from 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();
            }
        }
    }

然后将此方法添加到您的控制器以替换 asp.net mvc 的 Json 方法:

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

啊,还有一件事,不要犹豫在 MyClass 属性上使用 Json.Net DefaultValue 属性:

[DefaultValue(null)]
于 2012-01-03T09:36:56.883 回答