总体思路
我的总体想法是拥有我网站的移动和桌面版本。用户可以通过页面底部的按钮切换版本。我正在使用 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.js
和 jQueryMobileBehaviour.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/