执行点击事件代码之前的链接按钮回发?
linkbuttons postback before executing click event code?
我正在尝试向我的网站添加一个基本开关,以便在静态布局和响应式布局之间切换。
我的页面底部有两个链接按钮:
<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;
}
事件应在 class 文件 (User.vb) 中设置一个介于 true 或 false 之间的布尔值,然后保存会话,在回发时 Page_Load 事件应该读取此布尔值并使用它来调整视口元标记:
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);
}
然而,当我点击 "Switch to Full Site" 链接按钮时,页面将回发,但没有任何改变。回发是否以某种方式过早触发?
你应该改变
if (c.ViewChange = false)
至
if (c.ViewChange == false)
为了某事的发生。但我认为这不会是你所期望的。因为page_load是在点击事件之前执行的。您可以将一些代码从 page_load 移动到单击事件处理程序。
页面加载事件将在您的点击事件之前发生。参考这个 here.
这意味着您对 ViewChange 的检查将在您将其设置到 OnClick 处理程序之前进行。
每当您回发时,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 中的实现不是很清楚。
尽管如此,根据我的理解,这是我的推荐:
- 由于页面加载将在按钮或 link 单击等 post-back 事件之前执行,因此您需要保留 class 对象的值
- 创建一个受保护的 属性 您的 class 类型(您 store/manage ViewChange 属性)
- 属性 应该在内部(在 get & set 中),hold/persist session/viewstate 中的值(类似于你写的)
- 设置和读取只能通过直接参考 属性(而不是您如何完成点击事件)
- 单击按钮并 post 设置新值后,您必须重定向到同一页面,因为只有这样 Page_Load 事件才会获得您指定的新布尔值我们刚刚更改了点击事件; (Page_Load 发生在任何其他 post-back 事件之前)
- 新重定向的替代方法是,您可以创建一个具有视图更改逻辑的函数(如您的 Page_Load 代码中所述),并且应该在您的 button/link 单击事件(post 布尔值更改),也在 Page_Load 事件中,但在“!IsPostBack”块中
希望对您有所帮助。
我正在尝试向我的网站添加一个基本开关,以便在静态布局和响应式布局之间切换。
我的页面底部有两个链接按钮:
<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;
}
事件应在 class 文件 (User.vb) 中设置一个介于 true 或 false 之间的布尔值,然后保存会话,在回发时 Page_Load 事件应该读取此布尔值并使用它来调整视口元标记:
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);
}
然而,当我点击 "Switch to Full Site" 链接按钮时,页面将回发,但没有任何改变。回发是否以某种方式过早触发?
你应该改变
if (c.ViewChange = false)
至
if (c.ViewChange == false)
为了某事的发生。但我认为这不会是你所期望的。因为page_load是在点击事件之前执行的。您可以将一些代码从 page_load 移动到单击事件处理程序。
页面加载事件将在您的点击事件之前发生。参考这个 here.
这意味着您对 ViewChange 的检查将在您将其设置到 OnClick 处理程序之前进行。
每当您回发时,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 中的实现不是很清楚。
尽管如此,根据我的理解,这是我的推荐:
- 由于页面加载将在按钮或 link 单击等 post-back 事件之前执行,因此您需要保留 class 对象的值
- 创建一个受保护的 属性 您的 class 类型(您 store/manage ViewChange 属性)
- 属性 应该在内部(在 get & set 中),hold/persist session/viewstate 中的值(类似于你写的)
- 设置和读取只能通过直接参考 属性(而不是您如何完成点击事件)
- 单击按钮并 post 设置新值后,您必须重定向到同一页面,因为只有这样 Page_Load 事件才会获得您指定的新布尔值我们刚刚更改了点击事件; (Page_Load 发生在任何其他 post-back 事件之前)
- 新重定向的替代方法是,您可以创建一个具有视图更改逻辑的函数(如您的 Page_Load 代码中所述),并且应该在您的 button/link 单击事件(post 布尔值更改),也在 Page_Load 事件中,但在“!IsPostBack”块中
希望对您有所帮助。