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

ASP: Switching between two ScriptManagers. Or how to remove script reference

本文关键字:何删除 或者 删除 引用 脚本 之间 两个 ASP ScriptManager      更新时间:2023-09-26

总体思路

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

问题

切换主题很好,但由于我的主页中的以下ScriptManager中已经包含了JavaScript文件:

<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引起的问题。有没有办法使用两个ScriptManager(某种主题,但用于js文件)?

我尝试过但没有成功

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

第二种方法是以编程方式删除类似于sm.Scripts.Remove的移动JavaScript文件。

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

我终于想出了一个解决方案。我试着添加了两个<asp:ScriptManager runat="server" ID="sm">,并根据@Aristos建议的网站版本将其设为sm.Visible = true/false。然而,我不能在同一页上使用两个ScriptManager,而且ScriptManager也没有Visible属性。

这就是我所做的。

首先,由于我需要在两组脚本之间切换,我制作了两个单独的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>

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

                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切换器。

希望这能帮助到别人。