Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Контролы и кнопка "Назад"


Автор: Nex 7.5.2007, 18:24
Делаю опросник, логика работы - из базы вытаскивается текст вопроса и тип, создается нужный контрол (textarea, radiobuttongroup, пр...), пользователь отвечает на вопрос, нажимает кнопку "далее", на onClick его ответ сохраняется в базу и вытаскивается следующий вопрос. Все работает, но если человек ответит на вопрос, нажмет "Далее", ему отрисуется второй вопрос, а он нажмет у себя в браузере на конопочку "Назад", и еще раз ответит на первый вопрос, то я у себя на сервере все-равно вижу контролы, сгенерированные для второго вопроса - ID вопроса и прочее. Т.е. получается что человек вроде как ответил на 2й вопрос, нажав на кнопку "Далее" на странице первого. Вообщем-то получается что контролы берутся не из сгенерированного хтмл'а, а хранятся на сервере (как бы в сессии) - по крайней мере частично? Существуют ли какие-то стандартные методы защиты от такой ситуации, т.к. она, по-моему, должна быть довольно таки распространенной?..

Автор: Pankon 7.5.2007, 18:55
Цитата(Nex @  7.5.2007,  18:24 Найти цитируемый пост)
Существуют ли какие-то стандартные методы защиты от такой ситуации

думаю поможет javascript, который "не дает" писать в history смотри http://forum.vingrad.ru/index.php?showtopic=112202&view=findpost&p=856605

Автор: Mymik 7.5.2007, 18:57
А что ты используешь для отрисовки всех этих контролов и нажатия на кнопки "Далее". Wizard ???

Добавлено через 9 минут и 28 секунд
Народ, я глючу или как.
    Вообще JavaScript History возвращает браузер на предыдущий URL отличный от данного URL. Правильно ??? Следовательно, если у нас разные URL адреса, то можно сделать вывод, что и событие хочешь ты того или нет, но события будут разные, ну и страницы тоже разные, ведь URL страниц разные. 
    Следовательно возникает следующий вопрос к топик стартеру -- А как ты генерируешь вопросы, что ты и где хранишь ???

Автор: dazy 7.5.2007, 19:50
Может имеет смысл запретить кеширование страницы?

Код

protected override void OnInit(EventArgs e)
{
base.OnInit(e);    
Response.Cache.SetCacheability(HttpCacheability.Server);
}



Автор: Nex 10.5.2007, 11:51
Pankon, dazy, это все-равно проблему не решит. Человек может просто сохранить страницу к себе на комп и пр.

Mymik, визард не использую, URL остается тем же. У меня страница генерируется полностью динмаически, я получаю следующий вопрос, в зависимости от его типа создаю нужный контрол. В контроле хранится ID вопроса. Страница всегда test.aspx без всяких параметров. По onClick на кнопке "Ответить" я беру из контрола ID вопроса и текст ответа. Т.е. если бы при возврате "Назад" я бы получал ID старого вопроса меня бы все устраивало, а сейчас получается что ID вопроса новый, а отвечает человек еще раз на старый вопрос...

Автор: Mymik 10.5.2007, 20:44
Nex, а как он тогда нажимает назад ??? я просто не понимаю механизма попадания на предыдущий вопрос... Возможно поможет такая штука как Response.Redirect страницы саму на себя. Тогда по нажатию F5 или Ctrl+R на сервере не сработает предыдущие событие. Возможно тебе это как раз и нужно...
Если это не то, то расскажи что за кнопка "назад" ??? Если это кнопка браузера, AFAIK так это ж опять таки возврат на страницу с URL отличным от данной страницы.
А можешь привести пример кода (выципи строчки) Где ты генерируешь контролы. Т.е. как ты их генерируешь... может быть собака зарыта там. И желательно где ты хранишь данные из СУБД. Как ты определяешь последующий вопрос ???

Автор: dazy 11.5.2007, 07:17
Цитата(Mymik @  10.5.2007,  23:44 Найти цитируемый пост)
Если это кнопка браузера, AFAIK так это ж опять таки возврат на страницу с URL отличным от данной страницы.

Как я понял у Nex'а,  в любом случае будет один и тот же URL.

Я так понимаю у вас не сами конролы в сеесии хранятся, а их описание, ну там ИД вопроса, текст, тип.... Попробуйте сохранять основыне данные так же и во ViewState. А при клике на кнопке в самом начале обработки восстанавливать эти данные в session (или сверять их, и если не совпало, то в базу не писать). 

Автор: Mymik 11.5.2007, 08:44
Если они хранятся где-то в Сессии, то лучше даже не в сессии их хранить, а в CommandArgument кнопки и запрашивать их значение из этого параметра кнопки.

Автор: kedicik 12.5.2007, 14:01
Я делаю так. В динамическом контроле есть поле невидимое для тестируемого.  Оно содержит идентификатор вопроса из БД. Каждый раз при загрузке динамического контрола оно соответстует данному вопросу.  В динамическом контроле я вывожу ответы для данного вопроса. в зависимости от типа вопроса  эти контролы разные соответственно. Поэтому если нажать на кнопку Назад из броузера то идент. вопроса считается из этого поля. И никаих заморочек не будет. Я сама делала в точности такой вопросник. И эта кнопка меня напрягала. Но особенно когда я даю возможность посмотреть результат тестируемому а он опять по этой кнопке хочет переопределить свои ответы. Тут еще хуже было. Вроде в БД я занесла его оценку а он по новой хочет исправить ее а этого нельзя ему! Вот тут я запоминала в сессии переменную. И тогда проверяла смотрел он свой результат или нет. И по кнопке назад выдавала ему что он уже не может изменить свой результат. Не знаю правильно или нет. Но другого выхода не нащла

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)