弹出面板中的Pagemethods在IE9中第二次不加载。

13
我有一个主页面,其中有一些名为pagemethod的方法用于执行某些活动。在此主页面中使用了一个popuppanel(弹出面板内容页也具有pagemethods),用于显示某些详细信息。如果多次执行相同操作(即打开弹出面板多次),则在IE9之外的所有其他浏览器中都可以正常工作(甚至在IE8中也可以正常工作)。然而,首次执行成功的。下面提供了正在使用的代码。
以下是使用的Scriptmanager: <ajaxToolkit:ToolkitScriptManager runat="server" ID="TSCM1" EnablePageMethods="true" /> 主页面中的脚本:
function Clkd(){
     var ppnl=document.getElementById("if1");
     ppnl.src="Test1.aspx";
     $find('<%= MPE.ClientID %>').show();
}

function Clkd2(){
     var ppnl=document.getElementById("if1");
     ppnl.src="";
     $find('<%= MPE.ClientID %>').hide();
}

$(document).ready(function(){
     PageMethods.mainPageMethod("MainTest",cbackfn);
});

function cbackfn(str){
     alert(str);
}

页面方法:
 [System.Web.Services.WebMethod(EnableSession = true)]
        public static string mainPageMethod(String mainStr)
        {
            return mainStr + " Ok";
        }

Test1.aspx页面详情(此页面加载在弹出面板中):
以下是脚本代码:
$(document).ready(function(){
     PageMethods.Testpm("Test",fnd);
});

function fnd(str){
     alert(str);
}

页面方法:
 [System.Web.Services.WebMethod(EnableSession = true)]
        public static string Testpm(String alrt)
        {
            return "Ok";
        }

如果在第二次执行相同的操作时(仅适用于IE9),将会抛出以下错误。
SCRIPT5007: Unable to set value of the property '_UpdateProgress': object is null or undefined 
ScriptResource.axd?........

SCRIPT5007: Unable to get value of the property 'WebServiceProxy': object is null or undefined 
Test1.aspx, line 66 character 1

SCRIPT5007: Unable to get value of the property 'DomElement': object is null or undefined 
ScriptResource.axd?......, line 2 character 18851

SCRIPT5007: Unable to get value of the property 'add_init': object is null or undefined 
Test1.aspx, line 97 character 122

SCRIPT438: Object doesn't support property or method 'Testpm' 
Test1.aspx, line 11 character 4

重要提示:如果主页面没有任何页面方法,则工作正常。请帮我解决这个问题。


1
除了使用<%= MPE.ClientID %>以外,您尝试过其他不同的方法来提供MPE的客户端ID吗?<%= %>是Response.Write,它与MS Ajax的东西不兼容。 - Yuriy Galanter
是的,我尝试过了,但是出现了相同的错误。 - RGA
只需将“<%= MPE.ClientID %>”更改为“MPE”,并使用“#MPE”进行检查。 - RGA
1
不,它仍然必须是有效的客户端ID。作为一个测试,您可以在呈现的HTML中验证真实的客户端ID并尝试使用它吗?例如,它可能类似于$find('Parent_ctl00_MPE').show() - Yuriy Galanter
你能添加相关的HTML吗? - Nilesh Thakkar
显示剩余2条评论
5个回答

3

你应该添加相关的HTML代码,这样有助于他人帮助你。

我使用了你的代码,并添加了缺少的代码。当我运行它时,它在包括IE9在内的所有浏览器中都可以正常工作。

请查看下面的代码:

主页面(Default.aspx):

<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.9.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        function Clkd() {
            var ppnl = document.getElementById("if1");
            ppnl.src = "test.aspx";
            $find('<%= MPE.ClientID %>').show();
        }

        function Clkd2() {
            var ppnl = document.getElementById("if1");
            ppnl.src = "";
            $find('<%= MPE.ClientID %>').hide();
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <cc1:ToolkitScriptManager runat="server" ID="scriptmanager1">
    </cc1:ToolkitScriptManager>
    <asp:Panel ID="pnl1" runat="server">
        <iframe id="if1"></iframe>
        <asp:Button ID="btnHidePopup" runat="server" Text="Hide" />
    </asp:Panel>
    <asp:Button ID="btnShowPopup" runat="server" Text="Show" OnClientClick="Clkd();" />
    <cc1:ModalPopupExtender ID="MPE" runat="server" TargetControlID="btnShowPopup" PopupControlID="pnl1"
        DropShadow="true" OkControlID="btnHidePopup" OnOkScript="Clkd2()" CancelControlID="btnHidePopup">
    </cc1:ModalPopupExtender>
    </form>
</body>

Test.aspx:

<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.9.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            PageMethods.Testpm("Test", fnd);
        });
        function fnd(str) {
            alert(str);
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
     <cc1:ToolkitScriptManager runat="server" ID="scriptmanageriframe" EnablePageMethods="true">
    </cc1:ToolkitScriptManager>
    Hello World this is game.
    </div>
    </form>
</body>

Test.aspx.ce(Webmethod):
 [System.Web.Services.WebMethod(EnableSession = true)]
        public static string Testpm(String alrt)
        {

            return "Ok";
        }

我希望能对您有所帮助!

请使用IE9进行检查,第一次运行正常。隐藏弹出面板后再尝试显示,会出现错误。 - RGA
它在IE9中运行良好,每次打开都没有任何错误。只需在新项目中使用我的代码并尝试即可。 - Nilesh Thakkar

3

您可以尝试不同的弹出窗口。

例如:

  1. asp:ModalPopupExtender也可在ajaxtoolkit中使用。
  2. jQuery对话框弹出窗口。

1
在MPE上使用ClientIdMode="Static",并直接在$find()中使用MPE id。
ASPX代码:
<asp:ModalPopupExtender ID="modalpopup" ClientIDMode="Static" runat="server" CancelControlID="btnCancel"
OkControlID="btnOkay" TargetControlID="Button1" PopupControlID="Panel1" 
        Drag="true" >
</asp:ModalPopupExtender>

JavaScript代码:

$find('modalpopup').show(); // to show popup
$find('modalpopup').hide(); // to hide popup

1

IE9在同时具有主页面和弹出面板页面的情况下存在pagemethods问题。

您可以在webservice(.asmx)文件中使用pagemethods。

我尝试了以下方法:

defaultpage.aspx

<head id="Head1" runat="server">
    <title>Untitled Page</title>
    <script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
    <script type="text/javascript">

      function fnd123(str){
          alert(str);
    }

     function objFailed1(data) {
     fnd123(data);
      }
     function objGot1(data) {

                        fnd123(data.d);

             }
    function Clkd(){
    var ppnl=document.getElementById("if1");
    $.ajax({
             url: "Testser.asmx/GetData",
             contentType: "application/json; charset=utf-8",
             dataType: "json",
             data:'{"FileName":"Data from default page"}',
             type: 'POST',
             success:objGot1,
             error: objFailed1
         });
    ppnl.src="Test1.aspx";
     $find('MPE').show();
    }


     function Clkd2(){
    var ppnl=document.getElementById("if1");
     ppnl.src="";
     $find('MPE').hide();
     //PageMethods.clearPageData("/Test1.aspx",fnd1);
    }


    </script>
</head>
<body>
    <form id="form1" runat="server">
      <asp:ToolkitScriptManager runat="server" ID="ToolkitScriptManager1" EnablePageMethods="true" EnablePartialRendering="false"/>
    <div>
    <input type="button" onclick="javascript:Clkd();return false;" value="Click" />

    <div>
        <asp:ModalPopupExtender ID="MPE" PopupControlID="popupPanel" PopupDragHandleControlID="popupPanel"
            runat="server" Enabled="True" TargetControlID="btnOk" CancelControlID="BtnCancel"
            BackgroundCssClass="PopupBackground" Drag="True" EnableViewState=true >
        </asp:ModalPopupExtender>
        <asp:Button Style="display: none" ID="BtnOk" runat="server"></asp:Button>
        <asp:Button Style="display: none" ID="BtnCancel" runat="server"></asp:Button>
    </div>
    <div>
        <asp:Panel ID="popupPanel" runat="server" Style="overflow: hidden; z-index: 100000;
            display: none; background-color: White; filter: alpha(opacity=100); opacity: 1.0;
            height: auto;">
            <asp:Panel ID="pnlLoginHeader" runat="server" CssClass="" Style="display: none;">
                <table width="100%">
                    <tr style="text-align: center">
                        <td style="width: 97%;">
                            <p class="popupTitle">
                                <asp:Label runat="server" ID="lblTitle" Text=""></asp:Label>
                            </p>
                        </td>
                        <td style="width: 3%;">
                            <p style="text-align: right;">
                                <span id="lblPopupClose" style="cursor: pointer; color: White">Close</span>
                            </p>
                        </td>
                    </tr>
                </table>
            </asp:Panel>
            <iframe id="if1" src="" class="" style=""></iframe>
        </asp:Panel>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" 
            Text="Redirect" />
    </div>

    </div>
    </form>
</body>

Test1.aspx

<head id="Head1" runat="server">
    <title>Untitled Page</title>
        <script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-1.8.3.min.js"></script>

    <script language="javascript" type="text/javascript">
          function fnd(str){
          alert(str);
    }

     function objFailed1(data) {
     fnd(data);
      }
     function objGot1(data) {

                        fnd(data.d);

             }

     function Clkdwebservice(){
    $.ajax({
             url: "Testser.asmx/GetData",
             contentType: "application/json; charset=utf-8",
             dataType: "json",
             data:'{"FileName":"Data from test page"}',
             type: 'POST',
             success:objGot1,
             error: objFailed1
         });
   }

    </script>

</head>
<body>
    <form id="form1" runat="server" enableviewstate="false">
    <asp:ToolkitScriptManager runat="server" ID="ToolkitScriptManager1" EnablePageMethods="true" />
    <div>
        <input type="button" onclick="javascript:Clkdwebservice();return false;" value="Click" />
         <input type="button" onclick="javascript:parent.Clkd2();return false;" value="Close" />
    </div>

    </form>
</body>

Testser.asmx.cs

[WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ScriptService]
    [ToolboxItem(false)]
    public class Testser : System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public String GetData(String FileName)
        {
                     string msg = FileName;
            return msg;
        }
    }

对我来说它运行良好。请检查一下。


1
我建议您使用jQuery对话框弹出窗口而不是使用您编写的相同Web方法的Ajax弹出面板。

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