【问题标题】:linkbuttons postback before executing click event code?执行点击事件代码之前的链接按钮回发?
【发布时间】:2021-03-31 02:15:53
【问题描述】:

我正在尝试向我的网站添加一个基本开关,以便在静态布局和响应式布局之间切换。

我的页面底部有两个链接按钮:

<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 事件应该读取这个布尔值并使用它来调整视口元标记:

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);
}

但是,当我单击“切换到完整站点”链接按钮时,页面将回发,但没有任何改变。回发是否以某种方式过早触发?

【问题讨论】:

  • 你的事件绑定到链接按钮在哪里?
  • 在 Page_Load 页面将检查我的 User.vb 类文件中的布尔变量,它应该显示适当的链接按钮,同时隐藏另一个(显示在 Page_Load 事件中),并且每个链接按钮都有一个单击应该更改布尔值然后刷新页面的事件。我不确定我需要在哪里添加额外的绑定?
  • 我认为@Hakunamatata 的意思是他没有在您的标记中看到 OnClick="lbtnFull_Click" ,这通常是声明事件绑定的地方。通过在您的事件处理程序中放置一个断点来仔细检查这一点,然后查看它是否在您单击按钮时中断。
  • 您是否尝试在这些事件处理程序期间检查任何断点以确保其是否被调用?

标签: c# asp.net asplinkbutton


【解决方案1】:

页面加载事件将在您的点击事件之前发生。引用此here

这意味着您将在 OnClick 处理程序中设置 ViewChange 之前对其进行检查。

【讨论】:

  • 是的,这似乎正是现在正在发生的事情。 viewchange 正在工作,但它需要额外的回发才能实际执行更改。我应该在页面生命周期的哪个部分检查视图更改?
  • 或许可以尝试将其放入 PreRender。
【解决方案2】:

你应该改变

if (c.ViewChange = false)

if (c.ViewChange == false)

让某事发生。但我认为这不会是你所期望的。因为 page_load 在点击事件之前执行。您可以将一些代码从 page_load 移至 click 事件处理程序。

【讨论】:

    【解决方案3】:

    当您回发时,总是会调用 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 点击事件中添加一些额外的代码,即显示什么和隐藏什么。

    【讨论】:

    • 谢谢,我更新了链接按钮以引用 OnClick 事件。由于他们在单独的类文件中更改了一个变量(无论回发状态如何都应该保持更改),我还需要使用 !ispostback 部分吗?
    • 当然,初始数据应该始终包含在 !IsPostback 中。
    【解决方案4】:

    首先,您在 Page_Load 中的实现不是很清楚。

    不过,据我了解,这是我的建议:

    • 由于页面加载将在按钮或链接点击等回发事件之前执行,因此您需要保留类对象的值
    • 创建类类型的受保护属性(存储/管理 ViewChange 属性的位置)
    • 该属性应在内部(在 get 和 set 中),在 session/viewstate 中保持/保留值(类似于您所写的)
    • 设置和读取只能通过直接引用属性(而不是您如何完成点击事件)
    • 单击按钮并发布设置新值时,您必须重定向到同一页面,因为只有这样 Page_Load 事件才会获得您刚刚在单击事件中更改的新布尔值; (Page_Load 发生在任何其他回发事件之前)
    • 新重定向的替代方法是,您可以创建一个具有视图更改逻辑的函数(如您的 Page_Load 代码中所述),并且应该在您的按钮/链接单击事件上调用此函数(发布布尔值更改) 以及 Page_Load 事件中,但在 "!IsPostBack" 块内

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      相关资源
      最近更新 更多