【问题标题】:How to join JsonResult and return a single result - C#如何加入 JsonResult 并返回单个结果 - C#
【发布时间】:2018-08-19 22:41:27
【问题描述】:

我想将多个 JsonResults 加入到一个命名列表中,以便在 angularJS 中获取它。 这是我的功能:-

List<AdminBundle> abundleList = new List<AdminBundle>();

aBundleFetch.ListType = Constants.Board;
Func<JsonResult> functionBoard = new Func<JsonResult>(() => FetchTblData(aBundleFetch));
JsonResult resBoard = await Task.Factory.StartNew<JsonResult>(functionBoard);

aBundleFetch.ListType = Constants.Class;
Func<JsonResult> functionClass = new Func<JsonResult>(() => FetchTblData(aBundleFetch));
JsonResult resClass = await Task.Factory.StartNew<JsonResult>(functionClass);

aBundleFetch.ListType = Constants.ClassSubject;
Func<JsonResult> functionClassSubject = new Func<JsonResult>(() => FetchTblData(aBundleFetch));
JsonResult resClassSubject = await Task.Factory.StartNew<JsonResult>(functionClassSubject);

aBundleFetch.ListType = Constants.ClassMaterial;
Func<JsonResult> functionClassMaterial = new Func<JsonResult>(() => FetchTblData(aBundleFetch));
JsonResult resClassMaterial = await Task.Factory.StartNew<JsonResult>(functionClassMaterial);

我试过这个:-

var result = new { resBoard.Data + resClass.Data + resClassSubject.Data + resClassMaterial.Data };
            return Json(result, JsonRequestBehavior.AllowGet);

还有这个:-

JsonResult resultFinal = resBoard.Data  + resClass.Data + resClassSubject.Data + resClassMaterial.Data;

但他们不工作。我还想通过 AngularJS 中的名称获取不同的列表:-

$scope.ClearAndGetTblData = function (TblName) {
        $scope.TblData = [{ ListType: "Board" }];
        FetchListFactory.TblDataList($scope.TblData).then(function (d) {

            //This is where I want to fetch the returned result
            $scope.BoardList = d.data.BoardList;
            $scope.ClassList = d.data.ClassList;
            $scope.ClassSubjectList = d.data.ClassSubjectList;
            $scope.MaterialList = d.data.MaterialList;

            $scope.ShowTableWithName(TblName);
            if ($scope.BoardList != null && $scope.BoardList.length != 0) {
                $scope.AvailableListTextToShow = "";
            }
            else {
                $scope.AvailableListTextToShow = "No Data Available";
            }
            $scope.BoardTextToShow = "Select Board";
        }, function (error) {
            alert('Cannot Load Class Data');
        })
    }

我该怎么做?

【问题讨论】:

    标签: c# angularjs json asp.net-mvc


    【解决方案1】:

    您的代码中有很多错误:

    1. 您没有充分的理由使用Task.Factory.StartNew
    2. 你不能像那样组合JsonResult
    3. 即使可以,{ ... } + { ... } 也不会产生有效的 JSON

    所以,考虑到所有这些:

    1. 使FetchTblData 返回IEnumerable&lt;T&gt; - Controllers 之外的任何人都不应使用 ASP.NET MVC 特定的类
    2. 使用IEnumerable&lt;T&gt;.AddRange 连接结果
    3. 鉴于名称 FetchTblData 似乎暗示数据库连接,请将其设为 async Task&lt;IEnumerable&lt;T&gt;&gt;

    通过所有这些更改,您最终应该得到与此类似的内容(请注意,我标准化了您的变量和方法的名称):

    bundleFetch.ListType = Constants.Board;
    var boardData = await FetchTableDataAsync(bundleFetch);
    
    bundleFetch.ListType = Constants.Class;
    var classData = await FetchTableDataAsync(bundleFetch);
    
    ....
    
    var result = new List<T>(boardData);
    result.AddRange(classData);
    ...
    
    return Json(result);
    

    请注意,您的角度侧不会有不同的属性,因此您应该创建一个类来保存这些列表,而不是合并它们。

    【讨论】:

    • 感谢@Camilo 的回答。我正在使用 Task.Factory.StartNew 来运行 FetchTableData 并行。这样我的列表将花费更少的时间来加载。我错了吗?
    • @Deepak 是的,你错了。首先,由于您使用的是await,因此您没有并行执行此操作。其次,您应该使用Task.Run,但没有意义,因为FetchTblData 应该是异步的
    • 另外,如果我让 FetchTblData 返回一个 IEnumerable 它将影响我在其他角度函数中获取的结果。
    • @Deepak 是的,这是一个架构变化。域逻辑不应绑定到客户端逻辑
    • 那么你能建议一些东西来为多个列表并行运行我的 FetchTableData 吗?
    【解决方案2】:

    我不知道 .Data 的数据类型是什么,但这部分看起来不对。

    var result = new { resBoard.Data + resClass.Data + resClassSubject.Data + resClassMaterial.Data };
    

    你可以修复为

    var result = new { data = resBoard.Data + resClass.Data + resClassSubject.Data + resClassMaterial.Data };
    

    但我想它一定是

    var result = new {
     resBoard = resBoard.Data,
     resClass = resClass.Data,
     resClassSubject = resClassSubject.Data,
     resClassMaterial = resClassMaterial.Data
    };
    

    或者你可以返回一个数组

    var result = new DATA_TYPE[] {
     resBoard.Data,
     resClass.Data,
     resClassSubject.Data,
     resClassMaterial.Data
    };
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2011-05-14
      • 2023-03-14
      • 2014-04-23
      • 1970-01-01
      相关资源
      最近更新 更多