6

C# で asp.net MVC コントローラーから json データを送信し、それらのデータを使用してハイチャート円グラフを描画したいと考えています。

だから今のところ私はこれを使う:

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メソッドをオーバーライドできる場合があります。

私が持っていたもう1つの考え(そしてそれが機能するかどうかはわかりません)は、ArrayListのコレクションを持つことです。ArrayListは強く型ではないため、文字列とdoubleプロパティを追加できます。

これがどうなるか教えてください。

Simpleオブジェクトのリストを使用した場合はどうなりますか。キーと値のペアまたはその他の既存のクラスを使用できる場合があります。ただし、データを保持する単純なクラスを作成することはできます。

   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

知っておくと便利なことがもう 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 に答える
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 に答える
0

念のため。値がnullに設定されている場合、Highchartsはチャートを表示できません。また、asp.netmvcコントローラークラスのJsonメソッドはnull値をフィルター処理できません。

そのためには、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();
            }
        }
    }

次に、このメソッドをコントローラーに追加して、asp.netmvcの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.NetDefaultValue属性を使用することを躊躇しないでください:

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