1

int 型の JSON 配列から 2 番目の変数を渡そうとしています。SP_NAMEこれまでのところ、 (文字列である) 変数を渡すことしかできませんでしたがSP_ID、jQuery が情報を配置する場所を認識できるように、コントローラーからも渡す必要があります。

以下はコントローラーのコードです。問題が発生していると思われる行が 2 行あり、<------ 矢印を追加して皆さんにお見せしました。

[Authorize]
public virtual ActionResult getAjaxSPs(string MP = null)
{

    if (MP != null)
    {
        var SPList = from x in sp_index select x;


        var MPData = from y in mp_index
                     where y.MP_NAME == MP
                     select y;

        SPList = SPList.Where(x => x.MP_ID == MPData.FirstOrDefault().MP_ID);

        var SPRow = SPList.Select(x => new { x.SP_NAME, x.SP_ID }).Distinct().ToArray();  // <------- SPRow returns two variable SP_NAME and SP_ID (ex. Program1, 30) 

        float[] SPContent = new float[12];

        Dictionary<string, float[]> SPMonthRow = new Dictionary<string, float[]>();

        foreach (var item in SPRow)
        {

            SPContent = new float[12];

            var SPMonthList = from x in Full_Year_Numbers
                              where x.PROJECT_NAME == item.SP_NAME
                              group x by new { x.ACCOUNTING_PERIOD, x.PROJECT_NAME, x.AMOUNT } into spgroup
                              select new { accounting_period = spgroup.Key.ACCOUNTING_PERIOD, amount = spgroup.Sum(x => x.AMOUNT) };

            foreach (var mulan in SPMonthList)
            {
                int acounting_period = int.Parse(mulan.accounting_period) - 1;
                SPContent[acounting_period] = (float)mulan.amount / 1000000;

            }

            SPMonthRow[item.SP_NAME] = SPContent;
        }

        return Json(SPMonthRow, JsonRequestBehavior.AllowGet); //<--------- This is where I need to return two variables so I can use them both in the Jquery

    }
    return View();
}

したがって、このSPRow行では、必要なキーと値 (program1, 30) を取得しています。SP_IDこのように jQuery で使用できるように、JSON リターンで にアクセスする必要があります。

<div class = "sp-label" title = "' + SP + '" sub_program_id="' + SP.SP_ID + '" onclick="sp_click(this)">' + SP + '</div>'

このように追加item.SP_IDするだけでよいと思いましたSPMonthRow

SPMonthRow[item.SP_NAME, item.SP_ID] = SPContent;

しかし、もう一度ビルドしようとすると、このエラーが発生しました

no overload for method 'this' takes 2 arguments

このエラーにより、私は辞書を間違って定義したと思い込んでいます。これを考えるのは正しいですか、それとも軌道に乗っていませんか? SP_IDjQueryで使用されているJSON配列に取得する別の方法はありますか? SP_ID そのコントローラーから抜け出すためのあらゆる提案を正直に受け入れます。私のような問題を修正する方法がわかりません。ご協力いただきありがとうございます。問題の診断に役立つその他のコードや情報が必要な場合はお知らせください。

更新 1

foreach (var item in SPRow)
                {

                    SPContent = new float[12];

                    var SPMonthList = from x in act.WPD_Full_Year_Actuals
                                      where x.PROJECT_NAME == item.SP_NAME
                                      group x by new { x.ACCOUNTING_PERIOD, x.PROJECT_NAME, x.AMOUNT } into spgroup
                                      select new { accounting_period = spgroup.Key.ACCOUNTING_PERIOD, amount = spgroup.Sum(x => x.AMOUNT) };

                    foreach (var mulan in SPMonthList)
                    {
                        int accounting_period = int.Parse(mulan.accounting_period) - 1;
                        SPContent[accounting_period] = (float)mulan.amount / 1000000;

                    }

                    dynamic result = new
                        {
                            Name = item.SP_NAME,
                            Id = item.SP_ID
                        };

                    SPMonthRow[result] = SPContent;
                }

                return Json(SPMonthRow, JsonRequestBehavior.AllowGet);

            }
            return View();
        }

更新 2

この関数で使用されるテーブルのスキーマは次のとおりです

public partial class sp_catalog
    {
        public int SP_ID { get; set; } //primary key
        public Nullable<int> MP_ID { get; set; }
        public Nullable<int> IA_ID { get; set; }
        public string SP_NAME { get; set; }
    }


public partial class mp_catalog
    {
        public int MP_ID { get; set; } //primary key
        public Nullable<int> IA_ID { get; set; }
        public string MP_NAME { get; set; }
    }

public partial class Full_Year_Actuals

{
public string ACCOUNTING_PERIOD { get; set; }
public Nullable<decimal> AMOUNT { get; set; }
public string PROJECT_NAME { get; set; }
public int ID_actuals { get; set; }

}

アップデート 3

動的結果クラスを使用してみましたが、GameScripting から提供されたコードを使用できないため、うまくいきません。使用できない理由は、SQL DB を使用してデータを提供する必要があるためです。データは常に変化しているため、データをハードコーディングすることはできません。

私が望むのは、JSON を介してSP_NAMESP_ID金額を返せるようにすることだけです。SPContentこの理由は、私の jQuerySP_NAMEで、サブプログラムの名前 (例"subProgram1") を出力するために使用するためです。SP_IDサブプログラムを配置するプログラムをjQueryに知らせるために使用します(たとえばSP_ID = 1、サブプログラムがprogram1の下にある場合)。に含まれる金額は、ループSPContentに入力される月間合計です。foreach

(program1 Jan Feb Mar

  subProgram1 $100 $200 $300 etc...)`

これが意味することは、別の方法で金額データSPMonthRow[item.SP_NAME] = SPContent;を出力できない限り、この行を失うことはないということです。SPContentjQueryが必要なものを表示できるように、JSONの関数からデータが流れ続けることができる限り、私はすべてのソリューションにオープンです。エッセイで申し訳ありませんが、私を助けたい人がそうするために必要な情報を持っていることを確認したいだけです. 質問のステータスを頻繁にチェックするので、質問やコードのリクエストをお気軽にどうぞ。ご協力ありがとうございました!

4

2 に答える 2

3

.NET 4.0+ を使用する場合、動的型を使用してこれら 2 つの値を新しいオブジェクトにマージし、それを返すことができます。

dynamic result = new
{
    Name = item.SP_NAME,
    Id = item.SP_ID
};
return Json(result, JsonRequestBehavior.AllowGet); 

アップデート:

お互いに関係があるように見える SP と MP について、あなたのコードが何を意味しているのか、私は本当に理解していません。したがって、アーカイブしようとしているもの、クエリが何を表しているかなどを説明するまで、コードに関するヘルプを提供することはできません。配列とディクショナリに関する一般的な情報を提供しようとします。

まず、利用可能なものを見てみましょう


JSON

{
   "Key1":5,
   "Key2":10,
   "Key3":155
}

C# (辞書の初期化構文を使用することもできます)

Dictionary<string, int> dictionary = new Dictionary<string, int>();

dictionary.Add("Key1", 5);
dictionary.Add("Key2", 10);
dictionary.Add("Key3", 155);

この構造は辞書と呼ばれ、単純なキーと値のストアです。「ここにデータがあります。名前を付けて保存してください」と言うことができますprogram1。後で外に出て、「保存されたデータの使用を教えてください」と言うことができますprogram1

JSON

[
   5,
   15,
   23,
   78,
   155,
   4,
   85
]

C# (ここでも初期化構文が使用可能です)

int[] array = new int[6];
array[0] = 5;
array[1] = 15;
array[2] = 23;
array[3] = 78;
array[4] = 155;
array[5] = 4;
array[6] = 85;

これは、値の単なる累積である配列であり、累積で一意の番号が自動的に取得されます (これはインデックスと呼ばれます)。これらの一意の番号は、1 ではなく 0 から始まります。

あなたが実際に持っているのは、実際のデータとして文字列キーと数値の配列を持つ辞書です。

JSON

{
   "program1":[
      101,
      34,
      67,
      876
   ]
}

C#

Dictionary<string, int[]> dictionary = new Dictionary<string, int[]>();

int[] values = new int[4];
values[0] = 101;
values[1] = 34;
values[2] = 67;
values[3] = 876;

dictionary.Add("program1", values);

あなたが欲しいのを見てみましょう


あなたは次のようなものが欲しい

{
   "program1", "30":[
      101,
      34,
      67,
      876,
      44
      7
   ]
}

それで、それは何ですか?辞書?配列?どのようにprogram1要素にアクセスしますか? その名前だけ?では、「30」とは何でしょう?ご覧のとおり、答えはありません。そんなものは存在しません。

私の解決策

次の構造が必要だと思います。

JSON

{
   "program1":{
      "30":[
         34,
         67,
         876,
         44,
         36,
         6
      ]
   }
}

このような構造体を取得するC#コードは次のようになります。

dynamic data = new
{
    program1 = new Dictionary<string, int[]>
    {
        {"30",  new int[]{34,67,876,44,36,6}}
    }
};

次は、本当に必要なものと、コードを機能させる方法を理解する番です。ハッピーコーディング:)


更新2

実際に何が起こるかを理解せずに、コードを動かしたいだけなら、これを試してみてください:

[Authorize]
public virtual ActionResult getAjaxSPs(string MP = null)
{

    if (MP != null)
    {
        var SPList = from x in sp_index select x;


        var MPData = from y in mp_index
                        where y.MP_NAME == MP
                        select y;

        SPList = SPList.Where(x => x.MP_ID == MPData.FirstOrDefault().MP_ID);

        var SPRow = SPList.Select(x => new { x.SP_NAME, x.SP_ID }).Distinct().ToArray();  // <------- SPRow returns two variable SP_NAME and SP_ID (ex. Program1, 30) 

        float[] SPContent = new float[12];

        List<dynamic> result = new List<dynamic>();

        foreach (var item in SPRow)
        {

            var SPMonthList = from x in Full_Year_Numbers
                                where x.PROJECT_NAME == item.SP_NAME
                                group x by new { x.ACCOUNTING_PERIOD, x.PROJECT_NAME, x.AMOUNT } into spgroup
                                select new { accounting_period = spgroup.Key.ACCOUNTING_PERIOD, amount = spgroup.Sum(x => x.AMOUNT) };

            foreach (var mulan in SPMonthList)
            {
                int acounting_period = int.Parse(mulan.accounting_period) - 1;
                SPContent[acounting_period] = (float)mulan.amount / 1000000;

            }

            result.Add(
                new {
                    Name = item.SP_NAME,
                    Id = item.SP_ID,
                    Content = SPContent
                });
        }

        return Json(result, JsonRequestBehavior.AllowGet);
    }
    return View();
}
于 2012-09-10T19:49:44.650 に答える
1

JSON の結果に使用する新しいオブジェクトを作成できます。

何かのようなもの:

[Serializable]
public class SPData{
    string SP_NAME{get;set;}
    float SP_CONTENT{get;set;}
    int SP_ID{get;set;}
}

それを使用するときは、SPData の List<> を作成し、ループごとに新しいものを追加します。

List<SPData> SP_DATA = new List<SPData>();

foreach (var item in SPRow)
{
    // ...

    SP_DATA.Add(new SPData{SP_NAME=item.SP_NAME, SP_CONTENT=SPContent, SP_ID=item.SP_ID});
}

return Json(SP_DATA, JsonRequestBehavior.AllowGet);
于 2012-09-10T19:58:00.337 に答える