代码之家  ›  专栏  ›  技术社区  ›  Felipe Lima

如何在另一个打开的aspx页中设置控件值

  •  1
  • Felipe Lima  · 技术社区  · 16 年前

    我的问题很简单,但我找不到解决的办法:(

    当用户单击一个特定的按钮时,我需要打开一个新的aspx页面(在一个新窗口中),以便他能够选择一些需要返回到原始页面的内容。 我可以用WORKOW.OPEN打开新页面,但是,我不能在原始页面中设置所选的值。

    总之,输入字段需要从打开的页接收字符串值。我试过了 window.opener.getElementById() ,但是ASP.NET会干扰控件的ID,因此我无法在运行时确定输入字段的正确ID。

    有没有一种更简单的方法只使用服务器端代码(打开页面并返回值),而不是使用javascript和window.opener(在我看来,这非常糟糕)?

    如果没有,也欢迎任何其他简单的解决方案!

    6 回复  |  直到 10 年前
        1
  •  2
  •   Eugen Anghel    15 年前

    如果你用类似的东西 jquery 顺便说一下,这是高度推荐的,而不是使用基本DOM函数,您可以尝试:

    window.opener.$("[id$=txtValue]").val(valueToSet);
    

    应执行以下操作:

    • window.opener.$ 如果查询函数来自opener窗口
    • (“[id$=something]”)是一个选择器,它选择所有具有以“txtValue”结尾的“id”属性的元素(这就是解决丑陋id问题的方法)。
    • .val(“some value”)将该输入字段的值设置为“some value”。

    我不建议在javascript代码中硬编码asp.net id。那个身份证 总是 在将来的某个时候,由于某种原因而改变,你的页面将被打断。更不用说它是丑陋的:)

    另外,虽然window.opener解决方案有其缺点,但在服务器端执行此操作通常会导致更糟的情况,例如使用会话在页之间传递数据,或者在哪个页(父页或子页)之间首先回发的竞争条件。

        2
  •  0
  •   Adam Ralph    16 年前

    也许您应该在当前窗口中显示一个元素,并使用ajax控件确保页面的相关部分都已更新,而不是在新窗口中打开单独的页面。看看asp.net ajax弹出式扩展程序,当然还有updatepanel。

        3
  •  0
  •   Sara Chipps    16 年前

    为什么控制ID要更改?你在使用母版页吗?如果是这样,您可以在运行时获得控制ID,尽管它们不同,但您命名它们时,它们总是具有相同的值。

    这是最好的解决办法。

        4
  •  0
  •   DOK    16 年前

    你可以使用 Server.Transfer 在第二个.aspx页面(可以是弹出窗口)上,将querystring和form变量返回到第一个.aspx页面。

    Server.Transfer("firstPage.aspx", true)
    

    然后在第一页上,检索所需控件的值,如下所示:

    string x = Request.Form["SomeTextbox"].ToString();
    
        5
  •  0
  •   Felipe Lima    16 年前

    是的,我正在使用母版页,这就是为什么ID会更改。
    我相信我找到了解决办法。我使用的是控件类属性,而不是id或名称,因为类总是相同的。然后,我使用类名来获取id,并在querystring中将其传递到新页面。然后,新页面从querystring和getelementbyid获取id以获取控件对象。通过对象,它可以将其值设置为所需的值。
    这不是最简单的解决办法,但对我有效。谢谢你的回复。我完了!

        6
  •  0
  •   Zhaph - Ben Duguid    10 年前

    我使用以下方法获得与您类似的结果:

    在主页中,我查看浏览器是否可以显示一个模态窗口(基本上是Internet Explorer),如果是这样,弹出新窗口作为模态——这使我能够直接返回一个值到调用方法,否则我只会弹出一个新窗口并希望:

    if (window.showModalDialog)
    {
        // showModalDialog returns a result, so pass that into the receiving function
        // directly.
        CallbackFunctionName(ShowModal(displayPath));
    }
    else
    {
        // Just use the standard window.open methods.
        ShowWindow(displayPath);
    }
    
    function ShowWindow(displayPath)
    {
        var remoteWin=window.open(displayPath,"EditContact",
            "resizable=yes,toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,copyhistory=0,modal=yes,width="
            + dialogWidth + ",height=" + dialogHeight);
        remoteWin.creator=self;
        remoteWin.focus();
    }
    
    function ShowModal(displayPath)
    {
        return window.showModalDialog(displayPath, "editContact",
            "center:yes;resizable:no;dialogWidth:" + dialogWidth +
            "px;dialogHeight:" + dialogHeight + "px;");
    }
    

    然后,在打开的页面上,我再次检查是否能够像以前一样显示模式窗口:

    if(!window.showModalDialog)
    {
        // Call the callback method directly
        window.opener.CallBackFunctionName(resultValue);
    }
    else
    {
        // Return the value back to the caller, who will pass the result along.
        window.returnValue=resultValue;
    }
    self.close();
    

    ASP.NET只以已知的方式控制控件ID——一旦控件在服务器上运行时加载,就可以检索 ClientID 它将包含控件的运行时ID—您可以将此值写入js变量,或者使用一些js根据控件的其他功能来获取控件值。

    请注意,自ASP.NET框架的版本4以来,可以设置控件的 ClientIdMode 以获得对如何生成id的更多控制。