Переменная C # .Net неожиданная повторная инициализация - PullRequest
0 голосов
/ 26 августа 2009

Итак, у меня возникла проблема со страницей .aspx и некоторым кодом на стороне сервера, где я получаю неожиданные результаты.

Цель этой страницы проста, есть 5 радиокнопок и кнопка с функцией щелчка на стороне сервера. Идея состоит в том, что пользователь выбирает 1 из 5 переключателей, а затем нажимает кнопку. После нажатия кнопки я проверяю (не используя проверку формы, потому что я хотел по-другому), что кнопка проверена, и затем сохраняю выбранную опцию в базе данных.

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

Итак, в верхней части моего кода на стороне сервера я создал список возможных вариантов.

Затем у меня есть функция registerVote, которая принимает объект RadioButton, и число, чтобы получить настройку из файла конфигурации. Я добавляю эти 2 значения в класс-обертку, а затем добавляю их в список возможных опций.

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

public partial class VotePanel : System.Web.UI.Page
{
    List<VoteOption> voteOptions = new List<VoteOption>();

    public string registerVote(RadioButton newRadioButton, int voteOption)
    {
        voteOptions.Add(new VoteOption(newRadioButton, voteOption));
        return ConfigurationManager.AppSettings["vote_option_" + voteOption];
    }

    protected void Submit_Click(object sender, EventArgs e)
    {
        //Check vote
        string vote_value = "";
        bool someButtonChecked = false;

        foreach (VoteOption vo in voteOptions)
        {
            if (!someButtonChecked && vo.button.Checked)
            {
                vote_value = vo.movie;
                someButtonChecked = true;
            }
        }
        //....
    }
}

class VoteOption
{
    public RadioButton button;
    public int vote_value;

    public VoteOption(RadioButton r, int v)
    {
        button = r;
        vote_value= v;
    }
}

Код, который я использую на странице для добавления переключателя, выглядит следующим образом

<% = RegisterMovie (RadioButton1,1)%>

Теперь о проблеме, с которой я сталкиваюсь. Всякий раз, когда нажимается кнопка отправки, список имеет счетчик нуля и выглядит так, как будто он был повторно инициализирован. Я подтвердил, что значения добавляются, возвращая счетчик списка в методе registerVote, и объекты действительно добавляются, но по какой-то причине недоступны для функции Submit.

Теперь переменные на такой странице не должны повторно инициализироваться, верно? Я также протестировал строку, и она не была сброшена и была доступна для кнопки «Отправить». Я определил переменную класса string time = DateTime.Now.Ticks.toString (); и показывал, что после нажатия кнопки «Отправить» время всегда было одинаковым, независимо от того, сколько раз я нажимал на нее.

Так почему мой список должен повторно инициализироваться, но не строка? Есть идеи?

Ответы [ 4 ]

2 голосов
/ 26 августа 2009

Имейте в виду, что ваш класс страниц будет создаваться и разрушаться для каждого запроса - между каждой загрузкой страницы не будет поддерживаться состояние, вам необходимо правильно воссоздать состояние по мере необходимости. В этом случае кажется, что ваш список voteOptions не воссоздается до вызова Submit_Click.

Вам нужно будет зарегистрировать все варианты голосования независимо от того, находится ли страница в обратной передаче или нет в обработчиках Page_Load или OnInit страницы. Это восстановит voteOptions, к которому затем будет обращаться при вызове Submit_Click.

Взгляните на жизненный цикл страницы ASP.NET .

1 голос
/ 26 августа 2009

Кажется, проблема в том, что вы создаете список voiceOptions при визуализации страницы, а затем ожидаете, что он все еще будет присутствовать при обратной передаче. Объект Page не существует после того, как страница доставляется в браузер, поэтому список параметров голосования также удаляется, когда браузер получил страницу.

Вам нужно будет либо восстановить список voiceOption до или во время Submit_Click на обратной передаче, либо указать в значении переключателя достаточно информации, которая вам не нужна.

0 голосов
/ 26 августа 2009

asp.net не имеет состояния, поэтому при каждой обратной передаче (например, при нажатии кнопки «Отправить») воссоздается класс на стороне сервера. Если вы хотите, чтобы ваш список сохранялся между вызовами, вы должны сохранить его в ViewState или в скрытом поле. Не уверен насчет строки, хотя; то, что вы описываете, не соответствует жизненному циклу asp.net.

0 голосов
/ 26 августа 2009

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

Вы можете поместить список в сеанс и получить его обратно из сеанса.

Лично я бы изменил код на 1) Проверьте, находится ли список в памяти и получите его. Если нет в памяти, вызовите метод, чтобы сгенерировать его один раз, а затем поместите его в память. 2) Используйте RadioButtonList на своей странице, который затем можно привязать к своему списку в качестве источника данных.

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