javascript - ASP : Switching between two ScriptManagers. 或者如何删除脚本引用

标签 javascript asp.net

总体思路

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

我尝试过但没有成功的方法

我的第一个方法是从 ScriptManager 中删除移动 JavaScript 文件,然后手动将它们包含在切换到移动版本的按钮的点击事件中 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 文件,就像处理主题一样?

最佳答案

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

这就是我所做的。

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

对于桌面版:

    <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切换台准备就绪。

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

关于javascript - ASP : Switching between two ScriptManagers. 或者如何删除脚本引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18332567/

相关文章:

javascript - 在 Code.org HTML Web Lab 中,当 Javascript 变量达到某个数字时,如何为它着色?

javascript - 使用带有编译 typescript 的 jasmine karma 测试组件时如何解决 "define is not defined"错误?

asp.net - SSRS 异常 由于对象的当前状态,操作无效。和 AspNetSessionExpiredException

Javascript从数组中选择一个随机对象集

javascript - 机器人命令的角色权限

javascript - 如何包装属于一个类的一组元素以适合其父元素?

c# - GetExternalLoginInfoAsync() loginInfo 返回 null

c# - AES 加密 - 使用相同 key 和 IV 的不同加密值

c# - 是否可以在同一个 asp.net 网站中使用 C# 和 vb.net?

c# - LINQ to SQL 大查询元组