1

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

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

<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) 中设置一个布尔值,在 true 或 false 之间,然后保存会话,在回发时 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

4 回答 4

4

页面加载事件将在您的点击事件之前发生。参考这里

这意味着您对 ViewChange 的检查将在您在 OnClick 处理程序中设置它之前发生。

于 2015-09-23T01:50:44.563 回答
1

每当您回发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单击事件中添加一些额外的代码,即显示什么和隐藏什么。

于 2015-09-23T04:29:45.623 回答
1

你应该改变

if (c.ViewChange = false)

if (c.ViewChange == false)

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

于 2015-09-23T01:40:06.143 回答
0

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

尽管如此,根据我的理解,这是我推荐的:

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

希望这对您有所帮助。

于 2015-09-23T04:52:06.430 回答