Переменная уровня класса не остается установленной - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть веб-сайт .net, над которым я работаю, и использующий повторители для построения нескольких таблиц.Как часть Databind, я добавляю ключи к объекту словаря на уровне класса, чтобы позже я мог их вызвать и проверить, были ли они изменены.Ниже приведен мой код:

public partial class pointsEdit : System.Web.UI.Page
{

    public Dictionary<Int32, TextBox[]> PointsValues;

    protected void Page_Load(object sender, EventArgs e)
    {
        Int32 clientID = 0;
        if (Request.QueryString["id"] != null)
        {
             if (Int32.TryParse(Request.QueryString["id"], out clientID) == true) {
                 //try
                 //{
                     if (!IsPostBack)
                     {
                         btnReturn.HRef = "clientEdit.aspx?id=" + clientID;

                         PointsValues = new Dictionary<int, TextBox[]>();
                         using (var db = new db())
                         {

                             var ev = db.activityPoints.Where(x => x.ClientID == clientID).ToArray();
                             tblEvent.DataSource = ev;
                             tblEvent.DataBind();

                         }


                     }
                 //}
                 //catch
                 //{

                 //}
             }
        }

    }


    protected void tblEvent_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {

            using (var db = new db())
            {
                Int32 TypeKey;
                Int32 ActivityID;
                Int32.TryParse(DataBinder.Eval(e.Item.DataItem,"TypeKey").ToString(),out TypeKey);
                Int32.TryParse(DataBinder.Eval(e.Item.DataItem, "ActivityID").ToString(), out ActivityID);

                var ev = db.events.Where(x => x.ID == TypeKey).First();
                ((Label)e.Item.FindControl("lblEvent")).Text = ev.name.ToString();
                ((TextBox)e.Item.FindControl("tbPointValue")).Text = DataBinder.Eval(e.Item.DataItem, "MaxPointsEach").ToString();
                ((TextBox)e.Item.FindControl("tbMaxScored")).Text = DataBinder.Eval(e.Item.DataItem, "MaxAttempts").ToString();

                PointsValues.Add(ActivityID, new TextBox[] { ((TextBox)e.Item.FindControl("tbPointValue")), ((TextBox)e.Item.FindControl("tbMaxScored")) });

            }
    }


   protected void btnSubmit_Click(object sender, EventArgs e)
    {
        Int32 ActivityID;
        TextBox[] TextBoxes;
        Int32 clientID = 0;
        Int32 ParseResult = 0;
        Int32 MaxPoints = 0;
        Int32 MaxAttempts = 0;
        Boolean NeedsUpdate = false;

          if (Request.QueryString["id"] != null)
          {
              if (Int32.TryParse(Request.QueryString["id"], out clientID) == true)
              {
                  //try
                 //{


                      using (var db = new db())
                      {
                          var s = db.activityPoints.Where(x => x.ClientID == clientID).ToArray();

                          for (int i = 0; i < s.Length; i++)
                          {
                              ActivityID = s[i].ActivityID;
                              TextBoxes = PointsValues[ActivityID];
                          }
                      }

                  //} catch {

                  //}

                  }
              }


        }
 }

В блоке больше кода, который фактически обновляет значения, но мой цикл только заходит так далеко, поэтому я для простоты удаляю его.Когда он попадает в «TextBoxes = PointsValues ​​[ActivityID];»В строке метода submit создается впечатление, что объект Dictionary больше не заполняется.

Я проверил, что при добавлении в словарь есть идентификатор активности, и количество верных соответствует количеству объектов, которые должны были быть добавлены.В строке Textboxes, однако, он говорит мне, что «данного ключа не было в словаре», и когда я пытаюсь получить счетчик, он выдает ошибку «ссылка на объект не установлена ​​для экземпляра объекта».Если я устанавливаю объект словаря в новый объект словаря непосредственно перед этой строкой, это позволяет мне получить счетчик (из 0).Кажется, что объект как-то сбрасывается после установки.Есть идеи?

1 Ответ

0 голосов
/ 18 сентября 2018

Вы работаете с ASP.NET Web, что означает, что вы потеряете контекст объекта после обработки запроса.Это будет означать, что ваш словарь будет потерян.Вы должны либо сохранить его в каком-либо сеансе, чтобы поддерживать его между запросами.

Вы можете найти подробную информацию о том, как реализовать сеанс @ https://msdn.microsoft.com/en-us/library/ms972429.aspx?f=255&MSPPError=-2147217396

...