禁用ScriptManager在特定页面上

4

我在我的主页上有一个脚本管理器。有一两个内容页面需要删除webresourse.axd,因为它会影响页面上的其他javascript。

我该如何在这些页面上禁用脚本管理器?

ScriptManager对象似乎没有任何属性可以完成此任务。

这种操作是否可行?

4个回答

7

<asp:ScriptManager />移动到自定义控件中,例如MyScriptManager.ascx - .ascx文件中唯一的代码将是ScriptManager标记 - 然后您可以设置自定义控件上的Visible属性来控制是否呈现ScriptManager。

<foo:MyScriptManager id="scriptManager" runat="server" Visible="false" />

您甚至可以在MasterPage中添加一个属性,以便在内容页面中使用它来显示/隐藏ScriptManager:

// In your master page
public bool ShowScriptManager {get; set;}

// In your master page's Page_Load
private void Page_Load(object sender, EventArgs e) {
    ...
    scriptManager.Visible = ShowScriptManager;
    ...
}

由于大多数页面都需要ScriptManager,因此将其默认设置为true可能是一个好主意-我认为您可以在Master Page的构造函数或Page_Init方法中完成此操作:

public SiteMaster() {
    ...
    ShowScriptManager = true;
    ...
}

// Or alternatively
private void Page_Init(object sender, EventArgs e) {
    ...
    ShowScriptManager = true;
    ...
}

如果您在内容页面中设置了MasterType:

<%@ MasterType VirtualPath="~/path/to/master/page" %>

你只需要在内容页的 Page_Load 中做如下操作:
Master.ShowScriptManager = false;

干得好。不错的解决方案。我刚刚花了4个小时进行实验,才得出相同的解决方案。我应该先来这里! - Ian Patrick Hughes
如果我的iframe中存在ScriptManager,当我尝试在iframe中加载PDF文件时,我总是会收到“页面释放”JavaScript错误。您的技术使我能够顺利地完成操作并避免出现错误。谢谢! - ConnorsFan

4
您可以将脚本管理器放入ContentPlaceHolder中。
<asp:ContentPlaceHolder ID="cph_ScriptManager" runat="server"></asp:ContentPlaceHolder>
    <asp:ScriptManager ID="ScriptManager" runat="server"></asp:ScriptManager>
</asp:ContentPlaceHolder>

如果你想在某些页面上删除它,可以使用asp:Content标签将其指向,它将从页面中删除:

<asp:Content ID="content_SM_Overrride" ContentPlaceHolderID="cph_ScriptManager" runat="server">
<!-- ScriptManager Not Needed on this ASPX  -->
</asp:Content>

1

对于任何在此处并且仍无法通过UserControl使其正常工作的人...

如果您使用的是.Net 4.0,您可以使用新的AjaxFrameworkMode属性,并将其设置为Disabled。

ScriptManager.AjaxFrameworkMode Property

希望这能帮助到某些人!


谢谢,这应该是答案! - paddingtonMike

0

我会使用嵌套主页面。一个基础主页面包含您的标记,其中有一个额外的内容占位符,用于脚本管理器。然后是两个版本的嵌套主页面,一个带有脚本管理器,一个没有。您的页面使用适当的嵌套主页面。

我保留下面的文本,以便评论有意义,但这不起作用...

这样怎么样:

-在webconfig中放置一个appsetting,其中包含您不想要脚本管理器的URI列表。
-在主页面的page_init事件处理程序中,获取该集合并测试当前页面请求是否在列表中。如果是,则从主控件集合中删除脚本管理器。

即,在主页面代码后台:

Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    If DirectCast(Page, System.Web.UI.Page).AppRelativeVirtualPath = "~/Test.aspx" Then
        Me.Controls.Remove(Me.FindControl("ScriptManager1"))
    End If
End Sub

注意:你正在做的事情非常危险。如果你的母版页有任何更新面板,或者你正在移除管理器的任何页面上都有它们,它们将会崩溃。你可以在母版页和页面的init中循环遍历控件集合,并检查是否有任何更新面板。虽然,我不确定如果你找到了它们该怎么办。删除它们可能会删除其中的任何内容。最好的方法是,要么1)如果发现更新面板,则不要删除脚本管理器,要么2)自定义错误。

同意,在您计划删除脚本管理器的页面上,您不应该有更新面板。但这个问题在他的问题中是固有的:换句话说,任何删除脚本管理器的页面都存在这个问题,这就是他要求做的事情。 - Tim Hoolihan
是的 - 我正在寻找如何删除脚本管理器。 我已经尝试了以下方法: ScriptManager sm = (ScriptManager)Master.FindControl("sm"); sm.Visible = false;但是这会导致错误: 该方法或操作未实现。所以问题很简单: 如何从页面中删除脚本管理器 在相关页面上没有更新面板或其他任何东西。 - ChrisCa
谢谢。 它仍然呈现scriptrersource.axd文件。 我也尝试过 Master.Controls.Remove(Master.FindControl("sm"));但那也没用。 嗯......我想回到起点。 - ChrisCa
我明白你的意思。我在init、load和pre_render中尝试了ScriptManager1.Scripts.Clear(),但无法使脚本不显示在页面上。我将在上面添加另一种方法。 - Tim Hoolihan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接