Обратная связь по ссылкам перед выполнением кода события клика?
Я пытаюсь добавить базовый переключатель на свой сайт, чтобы переключаться между статическим и отзывчивым макетами.
У меня есть две кнопки ссылки внизу моей страницы:
<div id="toggleView">
<asp:linkbutton ID="lbtnMobile" runat="server" Visible="false">Switch to Mobile site</asp:linkbutton>
<asp:linkbutton ID="lbtnFull" runat="server" >Switch to Full site</asp:linkbutton>
</div>
У них обоих очень похожее событие OnClick.
protected void lbtnFull_Click(object sender, EventArgs e)
{
c.ViewChange = true;
Session["Customer"] = c;
}
protected void lbtnMobile_Click(object sender, EventArgs e)
{
c.ViewChange = false;
Session["Customer"] = c;
}
События должны установить логическое значение в файле класса (User.vb) между истиной или ложью, а затем сохранить сеанс; при обратной передаче событие Page_Load должно прочитать это логическое значение и использовать его для настройки метатега Viewport:
protected void Page_Load(object sender, System.EventArgs e)
{
//Other Stuff in here, irrelevant to current question
HtmlMeta view = new HtmlMeta();
view.Name = "viewport";
if (c.ViewChange = false)
{
view.Content = "width=device-width, initial-scale=1";
lbtnFull.Visible = true;
lbtnMobile.Visible = false;
}
else
{
view.Content = "width=1040px, initial-scale=1";
lbtnFull.Visible = false;
lbtnMobile.Visible = true;
}
MetaPlaceHolder.Controls.Add(view);
}
Однако, когда я нажимаю на кнопку "Переключиться на полный сайт", страница отправляется обратно, но ничего не изменилось. Постбэк как-то срабатывает слишком рано?
4 ответа
Загрузка страницы будет происходить ДО вашего клика. Ссылка это здесь.
Это означает, что ваша проверка ViewChange произойдет до того, как вы установите ее в обработчике OnClick.
Вы должны изменить
if (c.ViewChange = false)
в
if (c.ViewChange == false)
чтобы что-то случилось. Но я думаю, что это будет не то, что вы ожидаете. Потому что page_load выполняется до события click. Вы можете переместить некоторый код из page_load в обработчики событий click.
Когда вы отправляете обратно, всегда вызывается Page_Load. Таким образом, код, упомянутый внутри Page_Load, всегда будет выполняться.
protected void Page_Load(object sender, System.EventArgs e)
{
... All your mentioned code will be executed.
}
Следовательно, вы не найдете никаких изменений в вашей HTML- странице, просматриваемой в настоящее время в браузере, поскольку при обратной передаче также выполнялось начальное содержимое. Вы должны обернуть свой контент внутри !IsPostBack, чтобы заставить его работать должным образом.
Таким образом, измените ваш код следующим образом.
protected void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostback)
{
... All your mentioned code will be executed during normal load.
}
}
Кроме того, вам нужно добавить дополнительный код в событие щелчка LinkButton, т.е. что показать и что скрыть.
Во-первых, ваша реализация в Page_Load не очень понятна.
Тем не менее, это то, что я рекомендую, из того, что я поняла:
- Поскольку загрузка страницы будет выполнена до события post-back, такого как нажатие кнопки или ссылки, необходимо сохранить значение объекта класса.
- Создайте защищенное свойство типа вашего класса (где вы храните / управляете атрибутом ViewChange)
- Свойство должно внутренне (в get & set) удерживать / сохранять значение в session / viewstate (аналогично тому, что вы написали)
- Установка и чтение должны осуществляться только путем прямой ссылки на свойство (а не на то, как вы выполняли событие click).
- При нажатии кнопки и последующем установлении нового значения вам нужно будет перенаправить на ту же страницу, поскольку только тогда событие Page_Load получит новое логическое значение, которое вы только что изменили в событии click; (Page_Load происходит перед любым другим событием после возврата)
- Альтернатива свежему перенаправлению заключается в том, что вы можете создать функцию, которая имеет логику изменения представления (как показано в вашем коде Page_Load), и эту функцию следует вызывать для события нажатия кнопки / ссылки (после изменения логического значения), а также в событии Page_Load, но внутри блока "!IsPostBack"
Надеюсь, это поможет вам.