3

大概的概念

我的总体想法是拥有我的网站的移动版和桌面版。用户可以通过页面底部的按钮切换版本。我正在使用 ASP 主题,因此我可以根据所需的站点版本轻松切换主题。

问题

切换主题很棒,但是因为我JavaScript的项目中已经包含文件,ScriptManager在我的母版页的以下内容中:

<asp:ScriptManager runat="server" ID="sm">
        <Scripts>
            <asp:ScriptReference Path="~/Scripts/jquery-2.0.2.min.js" />
            <asp:ScriptReference Path="~/Scripts/jQueryMobileBehaviour.js" />
            <asp:ScriptReference Path="~/Scripts/Master.js" />
            <asp:ScriptReference Path="~/Scripts/jquery.mobile-1.3.1.min.js" />
        </Scripts>
</asp:ScriptManager>

当用户切换到桌面版本时,会出现由jquery.mobile-1.3.1.min.js和引起的问题jQueryMobileBehaviour.js。有没有办法使用两个 ScriptManagers(某种主题,但用于 js 文件)?

我尝试过的没有成功

我的第一种方法是从 中删除移动JavaScript文件ScriptManager,然后将它们手动包含在切换到移动版本的按钮的单击事件中sm.Scripts.Add

第二种方法是以编程方式删除JavaScript这样的移动文件sm.Scripts.Remove

    protected void CommandBtn_Click(Object sender, CommandEventArgs e)
    {
        switch (e.CommandName)
        {
            case "Desktop":
                HttpContext.Current.Response.Cookies["theme"].Value = "Desktop";
                //sm.Scripts.Remove(new ScriptReference("~/Scripts/jquery.mobile-1.3.1.min.js"));
                break;
            case "Mobile":
                HttpContext.Current.Response.Cookies["theme"].Value = "Mobile";                    
                //sm.Scripts.Add(new ScriptReference("~/Scripts/jquery-2.0.2.min.js"));
                //Response.Redirect(Request.RawUrl);
                break;
            default:
                break;

        }
        Page.Response.Redirect(Page.Request.Url.ToString(), true);
    }

两种方法都不起作用。

总结问题

  • 我的代码有问题吗 - 假设路径应该没问题?
  • 有没有更好的方法,可以让我切换JavaScript文件,就像使用主题一样?
4

1 回答 1

2

我终于想出了一个解决方案。我尝试添加两个<asp:ScriptManager runat="server" ID="sm">,并sm.Visible = true/false根据@Aristos 建议的网站版本制作它们。但是我不能ScriptManager在同一页面上使用两个 s 并且也没有属性 Visible 的ScriptManager.

这就是我所做的。

首先,因为我需要在两组脚本之间切换,所以我制作了两个单独的脚本ScriptManagerProxy(因为我不能有两个ScriptManagers)。

对于桌面版:

    <asp:ScriptManagerProxy runat="server" ID="smDesktop">
        <Scripts>
            <asp:ScriptReference Path="~/Scripts/jquery-2.0.2.min.js" />
            <asp:ScriptReference Path="~/Scripts/Modernizr.js" />
            <asp:ScriptReference Path="~/Scripts/Modernizr_full.js" />
            <asp:ScriptReference Path="~/Scripts/Master.js" />
        </Scripts>    
    </asp:ScriptManagerProxy>

对于移动版:

<asp:ScriptManagerProxy runat="server" ID="smMobile">
    <Scripts>
        <asp:ScriptReference Path="~/Scripts/jquery-2.0.2.min.js" />
        <asp:ScriptReference Path="~/Scripts/jQueryMobileBehaviour.js" />
        <asp:ScriptReference Path="~/Scripts/Modernizr.js" />
        <asp:ScriptReference Path="~/Scripts/Modernizr_full.js" />
        <asp:ScriptReference Path="~/Scripts/Master.js" />
        <asp:ScriptReference Path="~/Scripts/jquery.mobile-1.3.1.min.js" />
    </Scripts>
</asp:ScriptManagerProxy>

重要部分从这里开始

然后我将它们放在两个单独的用户控件中,我将它们注册到母版页:

<%@ Register Src="~/UserControl/ScriptManagerDesktop.ascx" TagName="smDesktop" TagPrefix="uc" %>
<%@ Register Src="~/UserControl/ScriptManagerMobile.ascx"TagName="smMobile" TagPrefix="uc" %>

然后在母版页正文中,我插入了一个 ContentPlaceHolder,我将使用它来插入其中一个用户控件,具体取决于所需的版本。

    <asp:ScriptManager runat="server" ID="sm"></asp:ScriptManager>
    <asp:ContentPlaceHolder ID="cphScripts" runat="server">
    </asp:ContentPlaceHolder>

最后在主页面代码隐藏中,我将所需的用户控件添加到占位符:

                if (HttpContext.Current.Request.Cookies["theme"] != null)
                {
                    switch (HttpContext.Current.Request.Cookies["theme"].Value)
                    {
                        case "Desktop":
                            cphScripts.Controls.Add(Page.LoadControl("~/UserControl/ScriptManagerDesktop.ascx"));
                            break;
                        case "Mobile":
                            cphScripts.Controls.Add(Page.LoadControl("~/UserControl/ScriptManagerMobile.ascx"));
                            break;
                        default:
                            cphScripts.Controls.Add(Page.LoadControl("~/UserControl/ScriptManagerDesktop.ascx"));
                            break;
                    }
                }

瞧,我已经ScriptManager准备好你的切换器了。

希望这会对某人有所帮助。

于 2013-08-20T12:15:05.553 回答