Angular 6/C#/MVC Динамически возвращать JsonResult из контроллера в виде Json Array of Array

Я пытаюсь экспортировать ряд наборов данных в Excel в приложении Angular 6. Для этого я использую XLSX и сохранение файла, как указано в этом примере: https://medium.com/@madhavmahesh/exporting-an-excel-file-in-angular-927756ac9857

Проблема в том, что поля могут время от времени меняться, поэтому мне нужно что-то динамическое (не хочу указывать имена столбцов). Для этого я нашел очень хороший пример: Привязка данных Json к таблица в mvc 4

Однако я не получаю данные в правильном формате. Мне нужно что-то вроде массива массивов. Я предполагаю, что в этом случае тип возвращаемого значения должен быть async Task<JsonResult>, но не знаю, как заставить его работать. Прикрепляю два изображения - в результате получаю resultObtained

и предполагаемый результат ArrofArr

Вот код из приведенного примера. Сохраненный вызов процедуры GetMyData использует SqlAdapter, и нет необходимости указывать имена полей.

 public JsonResult GetValue()
    {
        JsonResult json = new JsonResult();
        DataSet ds = GetMyData(); 
       /*LoadDoctordetailsNew is method where i get data from database and convert
          to dataset.It returns a dataset*/
        string returnData = GetJson(ds.Tables[0]);
        json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        json.Data = returnData;            
        return json;
    }

    public static string GetJson(DataTable dt)
    {
        System.Web.Script.Serialization.JavaScriptSerializer serializer =
           new System.Web.Script.Serialization.JavaScriptSerializer();
        List<Dictionary<string, object>> rows =
           new List<Dictionary<string, object>>();
        Dictionary<string, object> row = null;

        foreach (DataRow dr in dt.Rows)
        {
            row = new Dictionary<string, object>();
            foreach (DataColumn col in dt.Columns)
            {
                row.Add(col.ColumnName, dr[col]);
            }
            rows.Add(row);
        }
        return serializer.Serialize(rows);
    }

public static DataSet GetMyData()
        {
            try
            {
                using (SqlConnection connection = Connection.GetConnection())
                {
                  SqlDataAdapter da = new SqlDataAdapter("dbo.MySQLStoredproc", connection);
                    da.SelectCommand.CommandType = CommandType.StoredProcedure;
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    return ds;
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }

Пожалуйста, направляйте!

P.S.

Этот метод основан на использовании Dapper. Он возвращает данные в желаемом формате (массив массивов), но в объекте мы должны указать имена столбцов, которые будут жестко кодироваться, и поэтому я не могу использовать

public static IEnumerable<Object> GetMyData()
        {

            var strQuery = @"[dbo].[Myproc]";        
            IEnumerable< Object > items = new List<Object>(0);
            var p = new DynamicParameters();

            using (SqlConnection con = Connection.GetConnection())
            {
                items = con.Query<Object>(strQuery, param: p, commandTimeout: 120, commandType: System.Data.CommandType.StoredProcedure);
            }
            return items;
        }

Вызов из контроллера MVC

[HttpPost]
public async Task<JsonResult> SelectMyData()
{
    var task = Task.Run(() => Request.GetMyData());

    var retData = await task;
    return new JsonResult
    {
        ContentType = "application/json",
        Data = retData,
        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
        MaxJsonLength = int.MaxValue
    };
}

person SilverFish    schedule 23.01.2019    source источник
comment
Я не могу отличить результат, который вы получаете, от ваших предполагаемых результатов, они одинаковы, не так ли?   -  person JohanP    schedule 23.01.2019
comment
нет, они не. предполагаемый результат жестко закодирован в файле машинописного текста Angular и, как указано в примере экспорта файла excel. Я возвращаю те же результаты в виде набора данных, используя пример: «Привязка данных Json к таблице в mvc 4». Предполагаемый результат успешно создает файл Excel, но не фактический результат   -  person SilverFish    schedule 23.01.2019
comment
Похоже, вы отправляете строку, а не объект. Вы сами разбираете его в JSON? .NET сделает это за вас, просто верните массив как есть.   -  person Eraph    schedule 23.01.2019
comment
Пожалуйста, покажите код, который вы сделали до сих пор?   -  person er-sho    schedule 23.01.2019


Ответы (1)


Вы должны вернуть List<Dictionary<string, object>> вместо string. Вам не нужно Serialize данные, о которых позаботится JsonResult

public JsonResult GetValue()
{
    JsonResult json = new JsonResult();
    DataSet ds = GetMyData(); 
   /*LoadDoctordetailsNew is method where i get data from database and convert
      to dataset.It returns a dataset*/
    json.Data = GetJson(ds.Tables[0]);
    json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
    return json;
}

public static List<Dictionary<string, object>> GetJson(DataTable dt)
{
    List<Dictionary<string, object>> rows =
       new List<Dictionary<string, object>>();
    Dictionary<string, object> row = null;

    foreach (DataRow dr in dt.Rows)
    {
        row = new Dictionary<string, object>();
        foreach (DataColumn col in dt.Columns)
        {
            row.Add(col.ColumnName, dr[col]);
        }
        rows.Add(row);
    }
    return rows;
}
person Satpal    schedule 23.01.2019
comment
Спасибо большое! Вы сделали мой день - person SilverFish; 23.01.2019