обновление типа объекта сервера от клиента в asp.net - PullRequest
0 голосов
/ 13 декабря 2011

В веб-форме asp.net я хотел бы добавить значения обратно к типу объекта .net, который я создал на сервере в своем коде позади. У меня есть следующее:

  protected void Page_Load (object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                myArrayList.Add("Value 1");
                myArrayList.Add("Value 2");
                myBox.DataSource = myArrayList;
            }
            myBox.DataBind();
            myTime.Text = DateTime.Now.ToString();
        }

        protected void btnAddText_Click (object sender, EventArgs e)
        {
            myArrayList.Add(mytext.Text.ToString());
            myBox.DataSource = myArrayList;
            myBox.DataBind();
        }

        public ArrayList myArrayList = new ArrayList();

То, что я хотел бы сделать, это взять значения, введенные в текстовое поле на клиенте, и при нажатии кнопки добавить / добавить их в массив. В настоящее время (как и ожидалось) массив обнуляется после нажатия кнопки. Если я не использую isPostBack, он сохраняет только последнее значение, как и ожидалось. У меня есть asp: updatepanels в пользовательском интерфейсе с условными обновлениями, и я понимаю, что жизненный цикл страницы asp.net все еще срабатывает при обратной передаче (вызывая Init, Load, pre-render и unload).

Мой asp.net ржавый, но для подобных сценариев это лучший (единственный) подход - использовать Session State и сохранять массив в сеансе для манипуляций, или я что-то упустил?

Спасибо за любые советы,

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

После еще одного исследования я решил пойти по пути использования Session State.Есть несколько вариантов управления состоянием, но сессия была самой прямой и расширяемой для того, что я хотел сделать.

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

В документе я настраиваю базовое поле, кнопку и список для тестирования:

 <table>
            <tr>
                <td>
                    <asp:ListBox ID="lstItems" runat="server" Width="200px" Height="120px" />
                </td>
                <td valign="top">
                    <asp:TextBox ID="myTextBox" Height="32px" runat="server" Width="200px" />&nbsp;&nbsp;<asp:Button
                        Text="Add User" Width="80px" Height="32px" ID="myButton" OnClick="AddNames" runat="server" />
                </td>
            </tr>
        </table>

Затем в коде позади я настраиваю следующее:

// быстрый примерсостояния сеанса, где мы вносим вклад в объект сеанса из пользовательского интерфейса // аналогично примеру с корзиной покупок // Вы можете использовать любой объект или тип, я просто использовал массив, поскольку он был быстрым

protected void Page_Load (object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        //Create the session variable and base it upon the array created ( this can be any type)
        Session["myList"] = mainList;
    }
}

protected void AddNames(object sender, EventArgs e)
{
    //Here I set the array to = the Session. key point here is a session object must be cast to the approriate type on assignement
    mainList = (ArrayList)Session["myList"];
    //add to the array
    mainList.Add(myTextBox.Text.ToString());
    //bind to UI
    lstItems.DataSource = mainList;
    lstItems.DataBind();
    myTextBox.Text = string.Empty;
}

ArrayList mainList = new ArrayList();      

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

Надеюсь, это поможет

0 голосов
/ 13 декабря 2011

Вы также можете использовать viewstate, но это добавляет дополнительный код к загрузке, которую получает пользователь, что замедляет доставку страницы. Кроме того, я считаю, что наши объекты должны быть сериализуемыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...