Angular 6 / C # / MVC Динамически возвращает JsonResult из контроллера в виде Json Array of Array - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь экспортировать несколько наборов данных в Excel в приложении Angular 6.Для этого я использую XLSX и File-save, как указано в этом примере: 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;
            }
        }

Пожалуйста, руководство!

PS

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

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
    };
}

1 Ответ

0 голосов
/ 23 января 2019

Вы должны вернуть 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;
}
...