一般想法
我的一般想法是拥有我的网站的移动版和桌面版。用户可以使用页面底部的按钮切换版本。我正在使用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
类似的移动版本。< / 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
文件,就像主题一样?答案 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
切换台了。
希望这会对某人有所帮助。