ASP:在两个ScriptManagers之间切换。或者如何删除脚本引用

时间:2013-08-20 10:20:21

标签: javascript asp.net

一般想法

我的一般想法是拥有我的网站的移动版和桌面版。用户可以使用页面底部的按钮切换版本。我正在使用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.jsjQueryMobileBehaviour.js会导致问题。有没有办法使用两个ScriptManagers(某种主题,但js文件)?

我没有成功的尝试

我的第一种方法是从JavaScript中移除移动ScriptManager文件,然后在按钮的点击事件中手动将其包含在内,该按钮会切换到与sm.Scripts.Add类似的移动版本。< / p>

第二种方法是以编程方式删除移动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文件,就像主题一样?

1 个答案:

答案 0 :(得分:3)

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

所以这就是我所做的。

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

对于桌面版:

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

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

                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切换台了。

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