使用Json,jQuery和Ajax返回多个值

时间:2012-08-27 17:08:35

标签: c# ajax arrays json linq-to-sql

我正在尝试使用两个linq-to-SQL语句将数据从我可以在jQuery调用中使用的数据库返回到数组。我可以让Json返回一个数组,但我不能让它返回包含我需要列出的数量的第二个数组。

你看我正在做的是我正在创建一个树视图,列出每个部分的区域,项目和子程序。每个区域都有花费的总金额,每个项目都有花费的总金额,每个子程序都有花费的总金额。我已经能够获得子程序的总花费,但项目是一个不同的故事,因为我必须使用我用来显示子程序的相同控制器来显示每个项目的总计。它看起来有点像这样。

Area------------Jan--Feb--March--April--May--June--July--Aug--Sept--Oct--Nov--Dec

+Project--------Jan--Feb--March--April--May--June--July--Aug--Sept--Oct--Nov--Dec

++Sub-Program1--Jan--Feb--March--April--May--June--July--Aug--Sept--Oct--Nov--Dec

++Sub-Program2--Jan--Feb--March--April--May--June--July--Aug--Sept--Oct--Nov--Dec

由于项目金额是子程序金额的总和,并且与列出子程序的位置不同,因此我很难填充第二个数组。下面的代码来自我的控制器,并显示了如何为填充子程序名称的数组提取数据。

[Authorize]
        public virtual ActionResult getAjaxPGs(string SP = null, string PG = null)
        {

            if (SP != null)
            {
                var PGList = from x in db.pg_mapping
                             where x.PG_SUB_PROGRAM == SP 
                             select x;
                                 //select x.PG.Distinct().ToArray(); // I wanted to combine the PGRow = line below with the linq to SQL code above but it didn't like the .ToArray() 


                var PGRow = PGList.Select(x => new { x.PG }).Distinct().ToArray();

                return Json(PGRow, JsonRequestBehavior.AllowGet);

            }


            return View();
        }

所以这里的代码找到并输出子程序名称来代替Sub-Program1和Sub-Program2。这部分需要保留,以便输出正确的子程序名称,但现在我需要添加将在项目级别输出总量的代码。我以为我可以将这个代码添加到控制器并返回两个数组,但我做得不对,我尝试过的方法都没有。

var AmountList = from x in db.Spend_Web where x.PG == PG group x by new { x.ACCOUNTING_PERIOD, x.PG, x.Amount } into pggroup select new { accounting_period = pggroup.Key.ACCOUNTING_PERIOD, amount = pggroup.Sum(x => x.Amount) };

然后像这样返回

return Json(PGRow, AmountList, JsonRequestBehavior.AllowGet);

这不起作用,它引发了一个错误The best overload match for 'System.Web.MVC.Controller.Json(object,string,System.Web.MVC.JsonRequestBehavior)' has some invalid arguments

我完全接受所有建议,因为我所尝试的一切都没有奏效;即使一个建议让我走向一个全新的方向。老实说,我需要一些关于如何实现预期结果的指导。我希望我已经清楚地表达了我的问题。感谢您的所有时间和专业知识,请不要犹豫,要求任何额外的代码或澄清,因为我会尽可能经常回来查看。

更新

public class Container
        {
            Array PARow;
            Array AmountList;

        }

public virtual ActionResult getAjaxPGs(string SP = null, string PG = null)
            {
                var PGList = from x in db.pg_mapping
                             where x.PG_SUB_PROGRAM == SP
                             select x;

                container.PGRow = PGList.Select(x => new { x.PG }).Distinct().ToArray();

                container.AmountList = from x in db.Spend_Web
                                    where x.PG == PG
                                    group x by new { x.ACCOUNTING_PERIOD, x.PG, x.Amount } into pggroup
                                    select new { accounting_period = pggroup.Key.ACCOUNTING_PERIOD, amount = pggroup.Sum(x => x.Amount) };


            }

1 个答案:

答案 0 :(得分:1)

创建一个“容器”类,其中包含您希望返回的每种数据类型的实例。

class Container
{
    Array PGRow;
    Array AmountList;
}

然后在你的代码中:

Container container = new Container();
container.PGRow = ....;
container.AmountList = ....;