Petr Jaroš Ответов: 3

Как сохранить двумерный массив с помощью сеанса в ASP.NET-что?


Мне нужно сохранить двумерный массив в сеансе, который находится в int Original, а затем мне нужно извлечь его из сеанса. Есть какой-то выход? Я не могу решить эту проблему так долго. Он не работает и говорит::
System.InvalidCastException: Unable to cast object of type 'System.Web.UI.WebControls.Label' to type 'System.Int32[,]'.


Что я уже пробовал:

Я перепробовал все, но не могу понять этого.


Random rnd = new Random();
      int r = Convert.ToInt32(pocetR.Text);
      int s = Convert.ToInt32(pocetS.Text);
      int[,] MaticeA = new int[r, s];

      int[,] MaticeB = new int[r, s];

      for (int j = 0; j < s; j++)
      {
          for (int i = 0; i < r; i++)
          {
              int ko = rnd.Next(-50, 50);

              MaticeA[i, j] = ko;

              maticeA.Text = maticeA.Text + MaticeA[i ,j].ToString();
              maticeA.Text = maticeA.Text + " ";
              Session["MA"] = Session["MA"] + ' '.ToString();
          }
          maticeA.Text = maticeA.Text + "<br />";
          Session["MyArray"] = maticeA;
      }

      for (int j = 0; j < s; j++)
      {
          for (int i = 0; i < r; i++)
          {
              MaticeB[i, j] = rnd.Next(-50, 50);
              maticeB.Text = maticeB.Text + MaticeB[i, j].ToString();
              maticeB.Text = maticeB.Text + " ";
          }
          maticeB.Text = maticeB.Text + "<br />";
      }


  }

  protected void vypocitat_Click(object sender, EventArgs e)
  {

      int[,] fromSession = (int[,])Session["MyArray"];


      lblV.Text = fromSession[0, 1].ToString();




  }

3 Ответов

Рейтинг:
9

Richard Deeming

Если вы используете "традиционный" ASP.NET, вы можете просто сохранить значение непосредственно в сеансе:

int[,] values = { { 1, 2 }, { 42, 64 } };
Session["SomeUniqueKey"] = value;
int[,] otherValues = (int[,])Session["SomeUniqueKey"];


Если вы используете ASP.NET ядро, все немного сложнее. Вы можете непосредственно хранить массив байтов, и существуют методы расширения для строк и одиночных целых чисел. Но там нет ничего для массивов других типов или более сложных объектов.
Сессия в ASP.NET ядро | Microsoft Docs[^]
Интерфейс ISession (Microsoft.AspNetCore.Протокол HTTP) | Майкрософт Документы[^]

Обычный подход, по-видимому, состоит в том, чтобы сериализовать значение в JSON и сохранить его в виде строки:
int[,] values = { { 1, 2 }, { 42, 64 } };
Session.SetString("SomeUniqueKey", JsonConvert.SerializeObject(value));
int[,] otherValues = JsonConvert.DeserializeObject<int[,]>(Session.GetString("SomeUniqueKey"));
Однако существуют и более эффективные способы достижения этой цели.


Petr Jaroš

Большое вам спасибо, что это помогло.

Рейтинг:
25

F-ES Sitecore

// Create
int[,] a = new int[2, 2];
a[0, 0] = 1;
a[0, 1] = 2;
a[1, 0] = 3;
a[1, 1] = 4;

// Store
Session["MyArray"] = a;

// Retrieve
int[,] fromSession = (int[,])Session["MyArray"];


Petr Jaroš

Он не работает, он говорит: система.Которого вызывается invalidcastexception: не удается привести объект типа 'System.Веб.Пользовательского интерфейса.WebControls.Метка' для ввода 'System.Int32 [,]'.

Мне нужно сохранить это, потому что после нажатия на кнопку данные исчезнут.

Richard MacCutchan

Если ваши данные не являются набором целых чисел, то вы, очевидно, не объявляете массив как int тип.

F-ES Sitecore

Чтение между строк ваши данные-это текст метки, но вам нужно будет разобрать эту метку и превратить ее в массив перед сохранением, .net не может сделать это за вас.

F-ES Sitecore

c# чувствителен к регистру, у вас есть maticeA и MaticeA, что является плохой идеей. MaticeA это массив, так что это то, что нужно в магазине

Сессия["MyArray"] = MaticeA;

Petr Jaroš

Спасибо. Я все понял.

Рейтинг:
2

phil.o

Вместо этого вы можете попытаться сохранить его в виде одномерного массива.

readonly int R = 3;
readonly int C = 4;
int[,] bidim = new int[R, C];
int[] unidim = new int[R * C];

// bidim to unidim
for (int c = 0; c < C; ++c)
{
   for (int r = 0; r < R; ++r)
   {
      unidim[r * C + c] = bidim[r, c];
   }
}

// unidim to bidim
for (int c = 0; c < C; ++c)
{
   for (int r = 0; r < R; ++r)
   {
      bidim[r, c] = unidim[r * C + c];
   }
}