【问题标题】:Disable ScriptManager on certain pages在某些页面上禁用 ScriptManager
【发布时间】:2010-11-06 16:08:43
【问题描述】:

我的母版页上有一个脚本管理器。我需要从中删除一到两个内容页面,因为它会导致页面上的其他 javascript 出现问题

如何禁用这些页面上的脚本管理器?

ScriptManager 对象似乎没有任何看起来可以完成这项工作的属性

这可能吗?

【问题讨论】:

    标签: asp.net asp.net-ajax scriptmanager


    【解决方案1】:

    将您的 移动到自定义控件,例如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 可能是一个好主意 - 我认为您可以在母版页的 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 个小时尝试想出相同的解决方案。我应该先来这里!
    • 如果我的 iframe 中存在 ScriptManager,当我尝试在 iframe 中加载 PDF 文件时,我总是会收到“页面处理”javascript 错误。您的技术使我能够顺利完成并避免错误。谢谢!
    【解决方案2】:

    您也可以将脚本管理器放入 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>
    

    【讨论】:

      【解决方案3】:

      对于任何最终到这里但仍然无法使用 UserControl 的人...

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

      ScriptManager.AjaxFrameworkMode Property

      希望对某人有所帮助!

      【讨论】:

      • 谢谢,这应该是答案!
      【解决方案4】:

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

      我将留在下面的文字中,以便 cmets 有意义,但这不起作用...

      这个怎么样:

      -在您的 webconfig 中放置一个应用程序设置,其中包含您不希望拥有脚本管理器的 URI 列表。
      - 在 master 的 page_init 事件处理程序中,获取该集合并测试以查看当前页面请求是否在列表中。如果是这样,请从 master 的控件集合中删除 scriptmanager。

      即,在母版页代码后面:

      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
      

      注意:你正在做的事情有很多危险。如果您的母版页有任何更新面板,或者您要删除管理器的任何页面都有它们,它们就会被炸毁。您可以遍历 master 的控件集合和 masters init 中的页面,并检查是否有任何更新面板。虽然,我不确定如果你找到它们你会怎么做。删除它们可能会删除其中的任何内容。充其量,您可以 1) 如果找到更新面板,则不删除脚本管理器,或者 2) 自定义错误。

      【讨论】:

      • 同意,在您计划删除脚本管理器的页面上,您不应该有更新面板。但这个问题在他的问题中是继承的:换句话说,任何删除脚本管理器的页面都有问题,这就是他要求做的事情。
      • 是的 - 我正在寻找如何删除脚本管理器。我已经尝试了以下 ScriptManager sm = (ScriptManager)Master.FindControl("sm"); sm.可见=假;但这给出了一个错误:方法或操作未实现。所以问题很简单:如何从页面中删除脚本管理器在相关页面上没有更新面板或类似的东西
      • 谢谢。它仍然呈现 scriptrersource.axd 我也试过 Master.Controls.Remove(Master.FindControl("sm"));但这并没有帮助嗯......我认为回到绘图板
      • 我明白你的意思。我在 init、load 和 pre_render 中尝试了 ScriptManager1.Scripts.Clear(),但无法让脚本不显示在页面上。我会在上面添加另一个方法
      猜你喜欢
      • 2021-08-09
      • 2013-06-07
      • 2016-06-11
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 2019-04-07
      相关资源
      最近更新 更多