@heartdevil
плыву как воздушный шарик

Странное поведение сессионной переменной при множественных аякс запросах?

Привет.

Столкнулся с проблемой, которую непонятно как разрешить.

Код пока не буду приводить. Сначала опишу проблему в общем случае.

Имеется статический класс менеджер. С которым работает грид вью. В этом классе есть свойство, работающее с сессией. Эта сессия нужна, чтобы хранить выделенные по чекбоксу записи в грид вью. Есть некий двухшаговый функционал и вот там нужно помнить сессию. При одноразовом выставлении/снятии галочки у какой-то записи идет аякс запрос и срабатывает метод добавления/удаления значения в сессии и тут все Ок (В сессии хранится коллекция). Но если подряд раз пять-десять-много нажать на галочку и сгенерировать множество подряд идущих аякс запросов, то В сессии будет либо нуль, либо какое-то одно (чаще всего первое) значение (если выделено несколько галочек). Не могу понять, почему так происходит. Отладить в дебаге в студии тоже не получается, так как дебаг ловит первый аякс реквест и работает с ним, остальные реквесты туда не попадают. Они даже в браузере в файрбаге не появляются.

Может кто сталкивался с чем-то похожим. Прошу помочь, друзья.

UPDATE:

Друзья. Я локализовал проблему, но до сих пор не понял, что это за проблема.

Привожу сам код.
Имена переменных сокращены, чтобы не приводить точный код, но логика, полностью сохранена. Думаю, будет понятно.

Имеется вот такой код
protected void btnAction_Click(object sender, ImageClickEventArgs e)
{
			var trs = MlEManager.MlEItems.OfType<tcT>();
			CreateSCtion(trs, userId, date, comment, sCenterId);
}


Далее имеется вот такой код, уже в другой сборке.
public static SomeType CreateSCtion(IEnumerable<tcT> trs, Guid userId, DateTime date, string comment, Guid? sCenterId = null)
        {
            var result = SomeType.GetInstance();
            //try
            //{
                var firstT = trs.First();

                var trsCountTemp = trs.Count();
            
                var ction = new tcCtion
                {
                    UId = userId,
                    CtionBeginTime = date,
                    CtionEndTime = date,
                    CtionId = firstT.LocId,
                    SProviderAddressId = sCenterId,
                    STypeId = SType.All[SType.SAdjustment].STypeId
                };
                CManager.CContext.Ctions.AddObject(ction);
                ction.FId = ction.Loc.FId;

                if (ction.SProviderAddressId.HasValue)
                    ction.Com = ction.SCenter.Com;

                StringBuilder sb = new StringBuilder();
                foreach (var t in trs)
                {
                    CManager.CContext.CtedTrs.AddObject(new CtedT { Ction = ction, TId = t.TId, VirtualMMPlier = 1 });
                    sb.AppendLine(t.Id + "||||||||");
                }


                if (!String.IsNullOrEmpty(comment))
                    CManager.CContext.tcCtionCnts.AddObject(new CtionComment
                    {
                        Ction = ction,
                        Date = DateTime.Now,
                        UserId = CManager.CUser.UserId,
                        CtionCommentTypeEnum = 1,
                        CtionCommentText = comment
                    });

                CManager.CContext.SaveChanges();
                result.Data = ction;
				
                throw new Exception("top=" + trsCountTemp.ToString() + "========" + sb.ToString() + "======== bottom=" + trs.Count().ToString());
                
				//}
            //catch (Exception exc)
            //{
                //result.AddError(exc.Message);
            //}
            return result;
        }


Если проделать все вышеперечисленные действия, то в эксепшене будет запись, что top=1, а bottom=3 (3 - это действительное количество активных чекбоксов на данный момент). Ну и в sb будет одна итерация. Как такое может быть, чтобы одна переменная trs в одном блоке кода показывала разные данные в верху и внизу?
  • Вопрос задан
  • 180 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы