1

我正在尝试从 int 类型的 JSON 数组中传递第二个变量。到目前为止,我只能将SP_NAME(它是一个字符串)变量传递出去,但现在我还需要SP_ID从控制器传递出去,这样 jQuery 就知道将信息放在哪里。

下面是控制器代码。我认为问题出在两行,我添加了 <------ 箭头向你们展示。

[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_IDJSON 返回中的 ,这样我就可以像这样在我的 jQuery 中使用它。

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

我以为我可以item.SP_IDSPMonthRow这样添加

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

但是,当我尝试再次构建时,我收到了这个错误

no overload for method 'this' takes 2 arguments

这个错误让我相信我错误地定义了字典,我的想法是正确的还是我偏离了轨道?是否有另一种方法可以SP_ID进入 jQuery 中使用的 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 来为我提供数据。我无法对任何数据进行硬编码,因为它在不断变化。

我想要的只是能够返回SP_NAMESP_ID以及SPContent通过 JSON 输入的金额。原因是在我的 jQuery 中,我使用SP_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;,除非我能SPContent以另一种方式输出数量数据。我对所有解决方案持开放态度,只要我可以保持数据从 JSON 中的函数流出,这样 jQuery 就可以显示我需要的内容。很抱歉这篇文章我只是想确保任何想帮助我的人都有这样做所需的信息。当我经常检查我的问题的状态时,请随时提出任何问题或提出任何代码请求。谢谢您的帮助!

4

2 回答 2

3

使用 .NET 4.0+ 时,您可以使用动态类型将这两个值合并到一个新对象中并返回,就像

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;

这是一个数组,它只是一个值的累积,在累积中自动获得一个唯一的数字(这称为索引)。这些唯一编号从 0 开始,而不是从 1 开始。

您实际上拥有的是一个字典,其中包含一个字符串键和一个数字数组作为实际数据。

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 回答