执行点击事件代码之前的链接按钮回发?

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.
    }
} 

此外,您需要在 LinkBut​​ton 单击事件中添加一些额外的代码,即显示什么和隐藏什么。

首先,您在 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”块中

希望对您有所帮助。