0

我的网站是一个购物网站,通过检测浏览器标题,它会自动调整大小/样式并为移动/桌面浏览器安排一些零碎的东西。

重新排列一些东西的一个例子是购物车的位置。

在桌面浏览器视图中,购物车出现在右侧边缘。该站点被设计为在移动浏览器(即 iPhone)中更窄,因此在移动浏览器中显示时不存在右侧边距。在这种情况下,购物车被加载到标题中。

头部和购物车都是用户控件,而右侧边距内置在母版页中,因此,购物车用户控件的声明存在于母版页和页眉控件中。

我的 MasterPage 的相关标记如下所示

<div class="content">
    <div id="leftMargin" runat="server"></div>
    <div id="centre">
       <asp:ContentPlaceHolder id="centreContent" runat="server">/asp:ContentPlaceHolder>
    </div>
    <div id="rightMargin" runat="server">

        <controls:shopping ID="shoppingBasket" runat="server" />

    </div>
</div>

然后我有代码隐藏,如下所示:

If Common.isMobile() Then
    leftMargin.Visible = False
    rightMargin.Visible = False
End If

Header控件类似,除了隐藏一个完整的 div 之外,它隐藏了一个用户控件,即:

标记:

<div id="miniNav">
    <div id="mobileCart" class="mobileCart insertCart">                    
        <controls:shopping ID="shoppingBasket" runat="server" />
     </div>
     <!--- more buttons --->
</div>

代码:

If Common.isMobile Then
    shoppingBasket.Visible = True
Else
    shoppingBasket.Visible = False
End If

显然,但Common.isMobile功能是确定我们是否显示移动版。

所以,经过冗长的解释,我的实际问题很简单。

鉴于上面的示例,当在任何一种情况下呈现页面时,服务器是否完全忽略了所有隐藏元素的编码/标记/数据库交互等,htmlControl.display=false或者我是否导致服务器必须实际运行所有这些脚本两次,一旦被浪费,因为它实际上并没有做任何事情?

4

1 回答 1

1

您的代码将始终运行,它根本不会呈现给客户端。

如果您担心性能,您不应该将用户控件添加到页面。如果这不是一个选项,如果您是移动设备,您总是可以添加额外的逻辑来忽略昂贵的操作。

解决此问题的一种“可爱”方法是使用类似于 Visual WebParts 的范例,并使用服务器控件来包装您的用户控件。然后您的控件包装器会喜欢:

public class MyServerControl : WebControl
{
    #region Private Fields
    private const string _ascxPath = @"~/VisualControls/MyUserControl.ascx";
    #endregion

    #region Control Events
    protected override void CreateChildControls()
    {
        if (!Common.IsMobile)
        {
            var control = Page.LoadControl(_ascxPath);
            Controls.Add(this.control);
        }   
    }
    #endregion
}

并且只包括 MyServerControl 而不是 MyUserControl。

于 2012-08-27T14:27:40.790 回答